oracle 行级死锁_由Oracle触发器死锁及行级锁限制所衍生的解决方案

博客详细介绍了如何通过创建全局临时表和触发器来解决Oracle数据库中的行级死锁问题。在更新T表时,利用触发器for each row在session级操作,通过临时表记录锁定和更新状态,避免多并发环境下死锁的发生。通过跟踪更新流程,确保每个账户按顺序更新,最终成功解锁并更新记录。
摘要由CSDN通过智能技术生成

这里主要对前面触发器死锁那篇文章的具体化说明:

首先建立临时表(session级)。

create global temporary table tilog(

rid urowid,

lock_flag,

update_flag,

tmstmp timestamp(6)) on commit preserve rows;

由于是session级的,且触发器在内部不断嵌套触发过程中都是处于同一个session期。所以该临时表适合于此种情况,而且适合于多并发的环境。

解决思路:

触发器为update T表的时候触发。触发级别为for each row;

假设客户编号C下面有A1、A2、A3三个帐号。

步骤1:当对T表执行update语句的时候,即已经锁定了对应update所对应的行A1。此时,把对应的更新的这些行的rowid,锁定标识(lock_flag=1),更新标识(update_flag=0),时间戳(cast(sysdate as timestamp))存放到临时表tilog。

然后根据客户编号,找到对应的其他账户编号(A2、A3)。并批量放入到数组中(bulk collect into)。

步骤2:从数组中循环取出一个账户编号A2,并从tilog中查找该记录的锁定情况和更新情况。这里对于A2,tilog中尚未存在该记录。因此判断为无锁定和无更新。直接进入更新语句update。

步骤3:此时就又触发了该触发器,往tilog中插入A2的信息(rowid,lock_flag=1,update_flag=0,timestamp)。然后再次由客户编号得到A2外的两个账户编号A1和A3。然后从tilog中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值