Oracle多个写事务如何处理同一个数据块?

听STL争用的时候不禁想到一个问题,如果多个事务同时修改了同一个数据库的同一行数据,Oracle是如何在这个数据块上实现的呢?

假设1和2两个事务同时修改一个数据块的一行记录A:
T0:事务1和2同时开始
T1:事务1修改A为B
T2:事务2修改A为C
T3:事务1提交
T4:事务2回滚

如果简单地按照最后T4时回滚方式,数据块从UBA中回到A,显然这是不对的。

请问一下有谁知道其中原理?
标签: 暂无标签
cshhen

写了 1 篇文章,拥有财富 22,被 2 人关注

转播转播 分享分享 分享淘帖
回复

使用道具

P4 | 发表于 2012-10-13 20:55:46
如果按照你指定时间关系的话,正确顺序如下
T0:事务1和2并发修改记录A
T1:事务1先修改A为B
T2:事务2接着想修改A为C(这时事物2会一直等待,因为在修改A记录时发现该行头部指向的事物槽中的事物信息尚未提交,该活动事物对应事物1)
T3:事务1提交
T4:事务2这时才能正常修改事物1修改后的记录A。
回复

使用道具

P3 | 发表于 2012-10-14 11:06:07
wxjzqym 发表于 2012-10-13 20:55
如果按照你指定时间关系的话,正确顺序如下
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:
回复

使用道具

P6 | 发表于 2012-10-20 12:11:18
这是一个典型的行级锁和事务锁的概念
回复

使用道具

您需要登录后才可以回帖 登录 | 加入社区

本版积分规则

意见
反馈