Oracle中的并发更新:是否锁定?

Ron*_*ity 6 database oracle concurrency transactions

我糊涂了.我正在读Oracle中的MVCC.我以为MVCC意味着没有锁.但是,UPDATE无论隔离级别如何,我都在其他地方读到所有自动锁定.有人可以解释Oracle更新期间会发生什么吗?当多个读取提交的事务尝试并发时会发生什么update t set c = c + 1 where id = 3.结果是什么,在任一交易之前给定c = 1,以及锁和SCN发生了什么?

Begin T1
Begin T2
T1:  update t set c = c + 1 where id = 3
T2:  update t set c = c + 1 where id = 3
Commit T1
Commit T2
Run Code Online (Sandbox Code Playgroud)

Nul*_*ion 8

你没错,无论隔离级别如何,都会锁定行.使用MVCC,您可以在没有锁的情况下获得一致的读取,但在写入时仍需要锁定.

在尝试执行任何操作之前,第二个事务将等待第一个事务完成(例如:COMMITROLLBACK).因此,在这种情况下,T2上的光标将"挂起"在更新上,等待T1完成.

你会在T1提交后获得一个新的SCN,在T2提交后获得另一个SCN.