编程面试题:编写一个会造成数据库死锁的应用
发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,相信对于"开发一个会产生死锁的Java应用"这类需求,大家都能顺利完成。但是如果题目要求得更具体一些,要求这个死锁发生在数据库层面,应该怎样完成呢?下面我提供一种答案,采用SAP的编程语言ABAP(A
千家信息网最后更新 2025年01月19日编程面试题:编写一个会造成数据库死锁的应用
相信对于"开发一个会产生死锁的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安全错误
数据库的锁怎样保障安全
基本卫生人才数据库
wed安全和网络安全区别
变速精灵下载软件开发
网络安全属于什么方面硕士
中国结算总部软件开发有外包嘛
软件开发项目奖励注意事项
最强蜗牛怎么连接不上服务器了
海南金税盘安全接入服务器
服务器怎么做空间
学校网络安全专门管理机构
智慧水务网络安全配置
戴尔服务器添加光驱启动
企业做网络安全的目的
黄浦区营销软件开发管理
成都维众网络技术有限责任公司
辽宁省专升本网络技术基础题
虹口区提供数据库系统研发协议
工业网络技术控制器
软件开发技术研究生
山西星河科技学校互联网权益
数据库全外连接
小刀网络技术
软件开发施工组织计划
根据下拉菜单显示不同数据库
江苏自动网络技术解决方案
vps搭建rmi服务器
服务器手机管理工具
巨杉数据库最新进展
软件开发技术研究生
同一服务器两台电脑怎么联机