我很困惑。我正在读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
答案 0 :(得分:8)
你说得对,无论隔离级别如何,都会锁定行。使用MVCC,您可以获得没有锁定的一致读取,但在写入时仍需要锁定。
在尝试执行任何操作之前,第二个事务将等待第一个事务完成(例如:COMMIT
或ROLLBACK
)。所以在这种情况下,T2上的光标将“挂起”在更新上,等待T1完成。
T1提交后你会得到一个新的SCN,T2提交后会得到另一个。