相信对于"开发一个会产生死锁的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的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

编程面试题:编写一个会造成数据库死锁的应用相关推荐

  1. 编程题:编写一个函数string_copy()完成strcpy()的作用,并验证。

    编程题:编写一个函数string_copy()完成strcpy()的作用,并验证. #include<stdio.h> void string_copy(char *s1,char *s2 ...

  2. java语言编程三角形图形_编程题:编写程序输入三角形的3条边长,计算并输出... 求助一道JAVA编程题:编写一个类似记事本的图形用......

    导航:网站首页 > 编程题:编写程序输入三角形的3条边长,计算并输出... 求助一道JAVA编程题:编写一个类似记事本的图形用... 编程题:编写程序输入三角形的3条边长,计算并输出... 求助 ...

  3. java类求圆的面积周长_java编程 1. 设计一个求圆的面积和周长的类,要求:1计算当半径r,JAVA编程题。编写一个应用程序计算圆的周长和面积,设圆的半...

    问题标题 java编程 1. 设计一个求圆的面积和周长的类,要求:1计算当半径r,JAVA编程题.编写一个应用程序计算圆的周长和面积,设圆的半 2019-5-23来自ip:15.196.194.53的 ...

  4. c语言美元转换人民币的程序,【其它】编程题: 1.编写一个人民币和美元的双向汇率转换程序,实现美元和人民币转换,汇率:1美元=6.92人民币...

    [其它]编程题: 1.编写一个人民币和美元的双向汇率转换程序,实现美元和人民币转换,汇率:1美元=6.92人民币 更多相关问题 患者身热,微恶风寒,少汗,头昏,心烦,口干,干咳少痰,舌红少苔,脉细数. ...

  5. 编程练习:编写一个函数,用于计算某长方形面积的函数

    编写一个函数,用于计算某长方形面积的函数.要求:函数的输入是一个长方形的长和宽,且为整数.计算并输出长宽分别为3和4的长方形的面积.(PHP编程) 编写一个PHP文件,命名为php16.php,代码如 ...

  6. [C语言编程练习][14]编写一个程序,使用嵌套循环,按下面格式打印字母。A

    编写一个程序,使用嵌套循环,按下面格式打印字母. A BC DEF GHIJ KLMNO PQRSTU /*使用嵌套循环,打印下面的字母*/ #include <stdio.h> int ...

  7. java编程基础篇-- 编写一个程序,从键盘输入三个整数,求三个整数中的最小值。

    编写一个程序,从键盘输入三个整数,求三个整数中的最小值. package Exam01;import java.util.Scanner;public class Topic03 {public st ...

  8. [C语言编程练习][08]编写一个程序,提示用户输入名和姓,然后以“名,姓”的格式打印出来。

    编写一个程序,提示用户输入名和姓,然后以"名,姓"的格式打印出来. #include<stdio.h>int main(void) {char f_name[40];c ...

  9. [C语言编程练习][09]编写一个程序,提示用户输入名和姓,并执行以下操作

    编写一个程序,提示用户输入名和姓,并执行以下操作: a.打印名和姓,包括双引号: b.在宽度为20的字段右端打印名和姓,包括双引号: c.在宽度为20的字段左端打印名和姓,包括双引号: d.在比姓名宽 ...

最新文章

  1. linux 进程隐藏常见方法
  2. 【软件期刊01】2017-02-22
  3. spring boot 邮件端口_不会吧,SpringBoot还能发送邮件发送邮件?快来看看如何操作吧
  4. Java将Long类型转换为时分秒
  5. 1.14 Stream操作Collection集合
  6. Java设计模式-命令模式Command
  7. [js高手之路]构造函数的基本特性与优缺点
  8. 对于AES和RSA算法的结合使用以及MD5加盐注册登录时的密码加密
  9. java hiveconf_Java学习路线分享hive的运行方式
  10. C++_引用_引用的基本语法_注意事项_引用做函数参数---C++语言工作笔记031
  11. Python项目实战:爬取斗图网表情包图片
  12. 遇到相同流程时,(在流程比较复杂时)「【充分利用】 在【 之前的 作业过程中 做成的(留下的) 资源】」 ~
  13. oracle添加男女约束,Oracle如何给数据库添加约束过程解析
  14. java中AWT如何关闭窗口_java 窗口关闭的六种方法
  15. 德勤 oracle par面,经验 | 德勤19par面合集+楼主新鲜audit par面经验
  16. 数字签名与数字加密的区别
  17. hbuilderx为什么打不开_windows系统,HBuilderX无法启动、点击无反应、或启动报错的解决方案...
  18. 2022-2028全球与中国智能家居产品市场现状及未来发展趋势
  19. html代码数字上下滚动特效,js实现数字滚动特效
  20. 概率图模型概率模型 及其应用

热门文章

  1. 时间序列研(part2)--相关系数与自相关函数
  2. CSS基础(part10)--盒子模型之边框
  3. Django(part51)--自定义User模型
  4. 初识Mysql(part13)--我需要知道的7条Mysql语句之更新和删除数据
  5. 初识Mysql(part2)--我需要知道的8个Mysql语句
  6. python基础(part13)--包
  7. python与正则表达式(part6)--re模块使用
  8. html5中底部对齐怎么写,如何将页脚(div)与页面底部对齐?
  9. SAP Commerce Cloud (电商云) UI 的懒加载功能
  10. SAP系统和微信集成的系列教程之八:100行代码在微信公众号里集成地图搜索功能