这里主要对前面触发器死锁那篇文章的具体化说明:
首先建立临时表(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中