Oracle多个写事务如何处理同一个数据块?
听STL争用的时候不禁想到一个问题,如果多个事务同时修改了同一个数据库的同一行数据,Oracle是如何在这个数据块上实现的呢?假设1和2两个事务同时修改一个数据块的一行记录A:
T0:事务1和2同时开始
T1:事务1修改A为B
T2:事务2修改A为C
T3:事务1提交
T4:事务2回滚
如果简单地按照最后T4时回滚方式,数据块从UBA中回到A,显然这是不对的。
请问一下有谁知道其中原理? 如果按照你指定时间关系的话,正确顺序如下
T0:事务1和2并发修改记录A
T1:事务1先修改A为B
T2:事务2接着想修改A为C(这时事物2会一直等待,因为在修改A记录时发现该行头部指向的事物槽中的事物信息尚未提交,该活动事物对应事物1)
T3:事务1提交
T4:事务2这时才能正常修改事物1修改后的记录A。
wxjzqym 发表于 2012-10-13 20:55 static/image/common/back.gif
如果按照你指定时间关系的话,正确顺序如下
T0:事务1和2并发修改记录A
T1:事务1先修改A为B
这个理解应该是正确的,在讲到行级锁的时候应该也是这么解释的。
但是从实际情况来看,我还是有一些不太理解:
假设T1是一个很长的事务,在修改A之后还有大量的操作,
T1: ... ....
T1: update table_1 set A = b where id = 1;
T1: ... ...
T1: ... ...
T1: commit;
那么同一时候,T2应该会出现什么情况呢,在CLIENT端显示什么呢?
T2: update table_1 set A = c where id = 1; /* Any error or blocking info? */
T2: commit; /* Any error if this line can be input? */
个人感觉这与我之前的经验不太相符合,最好能实际实验一下。
我去装虚拟机机了(台式机被老婆占着,得先抢过来)……
如已有实验结果,请不吝分享。
T2: 这是一个典型的行级锁和事务锁的概念
页:
[1]