编程面试题:编写一个会造成数据库死锁的应用
发表于:2025-11-06 作者:千家信息网编辑
千家信息网最后更新 2025年11月06日,相信对于"开发一个会产生死锁的Java应用"这类需求,大家都能顺利完成。但是如果题目要求得更具体一些,要求这个死锁发生在数据库层面,应该怎样完成呢?下面我提供一种答案,采用SAP的编程语言ABAP(A
千家信息网最后更新 2025年11月06日编程面试题:编写一个会造成数据库死锁的应用
相信对于"开发一个会产生死锁的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的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:
应用
死锁
数据
数据库
运行
编程
成功
代码
层面
文档
模式
帮助
开发
不同
恰当
清楚
两个
信息
公众
只有
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
软件开发学费一般多少
数据库建库技术方案
无线网络技术共享密钥
数据库冗余概念
公司治理 数据库
金融软件开发工程师
株洲java数据库培训
新手学软件开发从哪里开始
法院网络安全必要性
陵园设计软件开发
坦克世界服务器不好怎么办
快推网络技术有限公司
数据库用户无法登录
软件开发学徒有薪水吗
场站端网络安全监测装置指南
征服之海的服务器
安装那个数据库2008
任拓软件开发面试题
苹果iOS移动端软件开发
服务器配置指标
如何理解网络安全的重要意义
计算机网络技术文献综述
网络技术培训广州
ho数据库
媒体服务器是不是就是解码器
江苏时间同步服务器设置云空间
宽带网络技术期末考试试卷
服务器 360安全
数据库中怎么写最高分的语句
任拓软件开发面试题