编程面试题:编写一个会造成数据库死锁的应用
相信对于"开发一个会产生死锁的Java应用”这类需求,大家都能顺利完成。但是如果题目要求得更具体一些,要求这个死锁发生在数据库层面,应该怎样完成呢?
下面我提供一种答案,采用SAP的编程语言ABAP(Advanced Business Application Programming)实现。
我们从ABAP帮助文档中得知,SELECT SINGLE FOR UPDATE在从数据库读取一条记录时,会在数据库里将该条记录上锁。帮助文档里也提到,如果编程不恰当,会引起死锁(deadlock)。
所以我们的答题就利用SELECT SINGLE FOR UPDATE这条语句。
首先在数据库里插入两条记录,主键分别为Z01和Z02。
开发两个应用,第一个应用依次锁Z01和Z02。
REPORT zlock1.DATA: ls_prod TYPE zorder_header.SELECT SINGLE FOR UPDATE * FROM zorder_header INTO ls_prod WHERE object_id = 'Z01'.SELECT SINGLE FOR UPDATE * FROM zorder_header INTO ls_prod WHERE object_id = 'Z02'.第二个应用依次锁Z02和Z01。REPORT zlock2.DATA: ls_prod TYPE zorder_header.SELECT SINGLE FOR UPDATE * FROM zorder_header INTO ls_prod WHERE object_id = 'Z02'.SELECT SINGLE FOR UPDATE * FROM zorder_header INTO ls_prod WHERE object_id = 'Z01'.
下面的步骤会造成数据库层面的死锁。
1. 以调试模式运行第一个应用,单步执行完代码第10行,成功锁住Z01。
2. 新开一个窗口,以调试模式运行第二个应用,单步执行完代码第10行,成功锁住Z02。
3. 回到应用1的窗口,继续执行。此时应用1试图锁Z02,但是Z02已经被应用2锁住了,因此应用1处于等待状态。
4. 回到应用2的窗口,继续执行。此时应用2试图锁Z01,但是Z01已经被应用1锁住了,所以应用2只有等待应用1释放出Z01的锁。但应用1此时也在等待应用2,因此造成了死锁。
ABAP和Java不同,一旦检测到死锁,应用会抛运行时异常并自动终止,异常信息里说得很清楚:Deadlock detected while executing transaction…
要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:
编程面试题:编写一个会造成数据库死锁的应用相关推荐
- 编程题:编写一个函数string_copy()完成strcpy()的作用,并验证。
编程题:编写一个函数string_copy()完成strcpy()的作用,并验证. #include<stdio.h> void string_copy(char *s1,char *s2 ...
- java语言编程三角形图形_编程题:编写程序输入三角形的3条边长,计算并输出... 求助一道JAVA编程题:编写一个类似记事本的图形用......
导航:网站首页 > 编程题:编写程序输入三角形的3条边长,计算并输出... 求助一道JAVA编程题:编写一个类似记事本的图形用... 编程题:编写程序输入三角形的3条边长,计算并输出... 求助 ...
- java类求圆的面积周长_java编程 1. 设计一个求圆的面积和周长的类,要求:1计算当半径r,JAVA编程题。编写一个应用程序计算圆的周长和面积,设圆的半...
问题标题 java编程 1. 设计一个求圆的面积和周长的类,要求:1计算当半径r,JAVA编程题.编写一个应用程序计算圆的周长和面积,设圆的半 2019-5-23来自ip:15.196.194.53的 ...
- c语言美元转换人民币的程序,【其它】编程题: 1.编写一个人民币和美元的双向汇率转换程序,实现美元和人民币转换,汇率:1美元=6.92人民币...
[其它]编程题: 1.编写一个人民币和美元的双向汇率转换程序,实现美元和人民币转换,汇率:1美元=6.92人民币 更多相关问题 患者身热,微恶风寒,少汗,头昏,心烦,口干,干咳少痰,舌红少苔,脉细数. ...
- 编程练习:编写一个函数,用于计算某长方形面积的函数
编写一个函数,用于计算某长方形面积的函数.要求:函数的输入是一个长方形的长和宽,且为整数.计算并输出长宽分别为3和4的长方形的面积.(PHP编程) 编写一个PHP文件,命名为php16.php,代码如 ...
- [C语言编程练习][14]编写一个程序,使用嵌套循环,按下面格式打印字母。A
编写一个程序,使用嵌套循环,按下面格式打印字母. A BC DEF GHIJ KLMNO PQRSTU /*使用嵌套循环,打印下面的字母*/ #include <stdio.h> int ...
- java编程基础篇-- 编写一个程序,从键盘输入三个整数,求三个整数中的最小值。
编写一个程序,从键盘输入三个整数,求三个整数中的最小值. package Exam01;import java.util.Scanner;public class Topic03 {public st ...
- [C语言编程练习][08]编写一个程序,提示用户输入名和姓,然后以“名,姓”的格式打印出来。
编写一个程序,提示用户输入名和姓,然后以"名,姓"的格式打印出来. #include<stdio.h>int main(void) {char f_name[40];c ...
- [C语言编程练习][09]编写一个程序,提示用户输入名和姓,并执行以下操作
编写一个程序,提示用户输入名和姓,并执行以下操作: a.打印名和姓,包括双引号: b.在宽度为20的字段右端打印名和姓,包括双引号: c.在宽度为20的字段左端打印名和姓,包括双引号: d.在比姓名宽 ...
最新文章
- linux 进程隐藏常见方法
- 【软件期刊01】2017-02-22
- spring boot 邮件端口_不会吧,SpringBoot还能发送邮件发送邮件?快来看看如何操作吧
- Java将Long类型转换为时分秒
- 1.14 Stream操作Collection集合
- Java设计模式-命令模式Command
- [js高手之路]构造函数的基本特性与优缺点
- 对于AES和RSA算法的结合使用以及MD5加盐注册登录时的密码加密
- java hiveconf_Java学习路线分享hive的运行方式
- C++_引用_引用的基本语法_注意事项_引用做函数参数---C++语言工作笔记031
- Python项目实战:爬取斗图网表情包图片
- 遇到相同流程时,(在流程比较复杂时)「【充分利用】 在【 之前的 作业过程中 做成的(留下的) 资源】」 ~
- oracle添加男女约束,Oracle如何给数据库添加约束过程解析
- java中AWT如何关闭窗口_java 窗口关闭的六种方法
- 德勤 oracle par面,经验 | 德勤19par面合集+楼主新鲜audit par面经验
- 数字签名与数字加密的区别
- hbuilderx为什么打不开_windows系统,HBuilderX无法启动、点击无反应、或启动报错的解决方案...
- 2022-2028全球与中国智能家居产品市场现状及未来发展趋势
- html代码数字上下滚动特效,js实现数字滚动特效
- 概率图模型概率模型 及其应用
热门文章
- 时间序列研(part2)--相关系数与自相关函数
- CSS基础(part10)--盒子模型之边框
- Django(part51)--自定义User模型
- 初识Mysql(part13)--我需要知道的7条Mysql语句之更新和删除数据
- 初识Mysql(part2)--我需要知道的8个Mysql语句
- python基础(part13)--包
- python与正则表达式(part6)--re模块使用
- html5中底部对齐怎么写,如何将页脚(div)与页面底部对齐?
- SAP Commerce Cloud (电商云) UI 的懒加载功能
- SAP系统和微信集成的系列教程之八:100行代码在微信公众号里集成地图搜索功能