我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

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


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

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


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

目录