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

简介:
+关注继续查看

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

相关文章
|
2月前
|
SQL 关系型数据库 MySQL
数据库的锁——代码实战篇
数据库的锁——代码实战篇
|
4月前
|
数据库
数据库中锁的概念以及实际场景遇到的问题和解决的办法
数据库中锁的概念以及实际场景遇到的问题和解决的办法
29 0
|
10月前
|
存储 SQL 供应链
数据库复习要点(数据库知识点总汇)
数据库复习要点(数据库知识点总汇)
86 0
|
10月前
|
关系型数据库 数据库 索引
数据库面试知识点
数据库面试知识点 1、架构 2、索引 3、锁 4、语法
76 0
数据库面试知识点
|
11月前
|
存储 SQL Oracle
【MySQL技术之旅】(2)带你认识一下数据库的锁
【MySQL技术之旅】(2)带你认识一下数据库的锁
57 0
|
11月前
|
Java 数据库 索引
Java开发 - 数据库中的基本数据结构(三)
Java开发 - 数据库中的基本数据结构
66 0
|
11月前
|
SQL 安全 Oracle
Java开发 - 数据库中的基本数据结构(二)
Java开发 - 数据库中的基本数据结构
95 0
|
11月前
|
SQL 存储 安全
Java开发 - 数据库中的基本数据结构(一)
Java开发 - 数据库中的基本数据结构
71 0
|
12月前
|
SQL Java 程序员
数据库关于事务的详解分析(全)包含面试常问的细节
目录前言1. 定义2. 特性 前言 在敲代码的时候,提交事务、事务回滚等,事务二字确官方笼统,不知道具体什么意思 这篇文章将为你解答疑惑 1. 定义 事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。 事务的提交是指事务
数据库关于事务的详解分析(全)包含面试常问的细节
|
算法 关系型数据库 MySQL
软件测试mysql面试题:数据库的乐观锁和悲观锁是什么?怎么实现的?
软件测试mysql面试题:数据库的乐观锁和悲观锁是什么?怎么实现的?
97 0