专栏首页Jerry的SAP技术分享编程面试题:编写一个会造成数据库死锁的应用
原创

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

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

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

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

    相信对于”开发一个会产生死锁的Java应用”这类需求,大家都能顺利完成。但是如果题目要求得更具体一些,要求这个死锁发生在数据库层面,应该怎样完成呢?

    Jerry Wang
  • 如何将Chrome本地安装的扩展应用导出到本地

    有时由于种种原因,我们不能直接使用Chrome web store进行Chrome扩展应用的安装,这时可以让一位已经安装了某Chrome扩展应用的朋友将他的应用...

    Jerry Wang
  • 如何将ST05生成的trace导入HANA Studio里并以图形化方式显示出来

    有的朋友可能在ST05里看到这个按钮但是不知道如何使用。

    Jerry Wang
  • Redis 简介

    简单来说, redis 就是一个数据库,不过与传统关系型数据库不同的是, redis 的数据是存在内存中的,所以读写速度非常快,因此 redis 被广泛应用于缓...

    happyJared
  • 表设计与“馄饨”理论 想作为一个问题来讨论

    其实是写错了,应该是混沌理论,不过大清早6:00在发这篇的时候,的确是饿了,见谅。

    AustinDatabases
  • Jprofile解析dump文件使用详解

    性能查看工具JProfiler,可用于查看java执行效率,查看线程状态,查看内存占用与内存对象,还可以分析dump日志.

    JavaEdge
  • 喜大普奔!GitHub官方文档推出中文版

    最近程序员交友圈出了一个大新闻,GitHub 帮助文档正式推出中文版了,之前一直都是只有英文文档,看起来费劲不方便。

    AI科技大本营
  • mysql主从同步(4)-Slave延迟状态监控

    之前部署了mysql主从同步环境(Mysql主从同步(1)-主从/主主环境部署梳理),针对主从同步过程中slave延迟状态的监控梳理如下: 在mysql日常维护...

    洗尽了浮华
  • 什么是0day漏洞

    在计算机领域中,0day通常是指还没有补丁的漏洞。也就是说官方还没有发现或者是发现了还没有开发出安全补丁的漏洞,比如苹果的越狱插件都是利用0day漏洞的。所以越...

    周俊辉
  • 升级微信后,再也不能做个安静的美男子了

    微信7.0版本如约发布了。虽然目前只有IOS版本支持更新,不过相信安卓版本也会在不久后到来。

    黄泽杰

扫码关注云+社区

领取腾讯云代金券