ABAP Deadlock

2024-02-15 18:18
文章标签 abap deadlock

本文主要是介绍ABAP Deadlock,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我们在计算机操作系统这门专业课上,学过死锁(Deadlock)的概念:两个或两个以上的进程(或线程)在执行过程中,由于竞争资源而造成的一种阻塞的现象,称为死锁。若无外力干预,这些处于死锁状态的进程将永远处于互相等待的阻塞状态中。

在使用ABAP答这道面试题之前,我们先看看如何用Java编写一个会出现死锁的程序。

不到40行代码就完成任务。为了便于ABAP从业人员理解,没有使用Java里的Lambda表达式,否则代码可以更短。

该程序逻辑如下:

线程1持有资源1,试图持有资源2;
线程2持有资源2,试图持有资源1;
死锁发生;

现在进入ABAP部分。

ABAP帮助文档提到,使用SELECT SINGLE FOR UPDATE读取单条记录时,会自动在数据库层面为该条记录设置一把锁(Exclusive lock,有的中文文档翻译成排他锁)。如果上锁操作会导致死锁发生,则会抛出异常。

于是我们首先创建一个ABAP数据库表,插入两条记录:

再开发两个ABAP程序ZLOCK1和ZLOCK2,分别按照Z01, Z02和Z02, Z01的顺序使用SELECT SINGLE FOR UPDATE向数据库发起读取请求。


开启两个SAPGUI窗口,按照下面的步骤执行这两个程序,即可产生死锁。

(1) 以调试模式单步执行程序ZLOCK1,成功执行完SELECT SINGLE FOR UPDATE … WHERE object_id = ‘Z01’, 意味着此时程序ZLOCK1在数据库层面对Z01这条记录设置了一把锁。


(2) 切换到另一个SAPGUI窗口,执行程序ZLOCK2, 单步调试执行完语句SELECT SINGLE FOR UPDATE … WHERE object_id = ‘Z02’,即此时程序ZLOCK2在数据库层面对Z02成功上锁。


(3) 再回到窗口1,继续调试程序ZLOCK1,此时调试器会阻塞,因为ZLOCK1试图对Z02上锁,而此时程序ZLOCK2持有记录Z02的锁。程序ZLOCK1处于阻塞状态,等待ZLOCK2释放对记录Z02设置的锁。

(3) 回到窗口2,继续在调试模式下执行ZLOCK2程序第12行语句。此时程序ZLOCK2试图对记录Z01上锁,但该记录已经被程序ZLOCK1锁住了,程序ZLOCK2只好等待程序ZLOCK1释放对记录Z01的锁;而程序ZLOCK1永远也不可能释放对记录Z01上的锁,因为此刻它已经处于阻塞状态了,在等待程序ZLOCK2释放对记录Z02的锁。

此时ABAP Kernel检测到程序ZLOCK2发生了死锁,抛出一个运行时异常,结束了ZLOCK2的执行。程序ZLOCK2持有对记录Z02的锁也自动释放了。最后的结果是,程序ZLOCK1成功地对记录Z02上了锁。

在事务码ST22里,我们能观察到这次死锁的详情。

ABAP Kernel这种检测到死锁发生后,立刻终止程序运行的方式,节省了应用开发人员通过阅读代码去分析死锁的时间。

回到Jerry之前的Java程序,运行之后两个线程陷入死锁,在控制台上没有打印任何可供排错的信息。然而JDK本身提供了方便的检查Java应用死锁状态的命令行工具:jstack.

命令行执行jstack,传入Java程序的进程id,如果该程序发生了死锁,该工具会打印出程序里具体是哪一行代码,在试图对何种资源进行上锁操作时出现的死锁,从而帮助开发人员迅速定位到逻辑上存在缺陷的代码位置。

 

这篇关于ABAP Deadlock的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/712147

相关文章

mysql Deadlock found when trying to get lock; try restarting transaction

一、现场情况 sql:insert into a ...... 数据库隔离级别:read-committed 表a有唯一索引 二、死锁发生的4个必要条件 1、互斥条件(Mutual Exclusion):资源独享 2、占有并等待条件(Hold and Wait):占有资源并等待其他资源 3、非抢占条件(No Preemption):占有的资源不可以被剥夺,只能主动释放 4、循环等待

ABAP CURSOR游标的应用1

【应用场景】BW模块定时增量抽取SAP的销售案场收款单的业务主数据 【关键语法】 FUNCTION ZBWFM_ZTSD0011 .*"----------------------------------------------------------------------*"*"本地接口:*"  IMPORTING*"     VALUE(I_REQUNR) TYPE  SRSC

ABAP Dialog Radio Button

额.妈了个巴子,整了一天,才发现,原来Dialog 的Radio Button 是要右键去设置组的 我就说为什么不行咧 误区:我以为是属性那里的组去设置的

ABAP OOALV 颜色COLOR设置

文章目录 行颜色、列颜色、单元格颜色设置COLOR行颜色设定实现过程运行结果 列颜色的设置实现过程运行结果 设置单元格颜色完成过程运行结果1运行结果2 行颜色、列颜色、单元格颜色设置COLOR 行颜色设定 参考文章:https://blog.csdn.net/Leo520liang/article/details/138697189 实现过程 TYPES: BEG

ABAP 代码执行中断时ST22无对应DUMP记录

1. 权限不足         比如仅可查看当前client的dump,参考note1974263 2. 记录在SM21         比如memory dump会记录在SM21日志下,ST22无对应记录,参考note2238247 3. 异步RFC或者odata接口中发生了未被捕获的可捕获异常         比如代码调用中抛出了异常,却没有在当前层级处理,对于此类异常需要通过其它日

ABAP怎么把传入的参数刷新到内表里面呢?

1.在执行相关的功能操作之前,优先执行这一段代码,把输入的数据更新入内表里面 DATA: lo_guid TYPE REF TO cl_gui_alv_grid.CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'IMPORTINGe_grid = lo_guid.CALL METHOD lo_guid->check_changed_data.CALL M

[SAP ABAP] 读取内表数据

1.读取单条数据 1.1 索引查找 语法格式 READ TABLE <itab> INTO <wa> INDEX <idx>. <itab>:代表内表 <wa>:代表工作区 <idx>:代表索引值 示例1 结果显示: 1.2 关键字查找 READ TABLE <itab> INTO <wa> WITH KEY k1 = f1 k2 = f2 ... kn = fn.

[SAP ABAP] 插入内表数据

语法格式 INSERT <wa> INTO <itab> INDEX <idx>. <wa>:代表工作区 <itab>:代表内表 <idx>:代表索引值 示例1 结果显示: 语法格式 INSERT <wa> INTO TABLE <itab>. <wa>:代表工作区 <itab>:代表内表 示例2 结果显示: 提示Tips:如果定义的是标准表,使用I

[SAP ABAP] 追加内表数据

向内表中逐条追加数据记录 语法格式 APPEND <wa> TO <itab>. <wa>:代表工作区 <itab>:代表内表 示例1 结果显示: 将一个内表中的所有数据记录添加到另一个内表中 语法格式 APPEND LINES OF <itab1> TO <itab2>. <itab>:代表内表 示例2 结果显示:

[SAP ABAP] 工作区

工作区是指多个预定义类型变量组成的一个变量(可理解为一组变量的集合) 程序中使用DATA关键字定义工作区 示例1 上述代码定义了2个工作区 lw_student0 和 lw_student1 示例2 lw_student是一个工作区 输出结果: 1.工作区变量赋值 示例1 输出结果如下所示: 示例2 输出结果如下所示: 示例3 输出结果如下