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

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

首先建立临时表(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中

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值