我对交易理论和实施感到困惑 根据教科书,数据项有共享和排他锁,这些锁是冲突的。因此,如果事务具有独占锁(用于插入/更新),则即使对于读取(选择/共享锁),也没有其他事务可以访问该数据项。 到目前为止这一点很清楚。但这在实际实施中似乎没有这种方式 mysql中的示例:
session1> begin;
session2> begin;
session2> insert into table (id, desc) values (1234, 'test');
session1> select * from table;
执行会话1的选择。如果我将其替换为select ...for update
,则仅阻止
但我不明白为什么普通选择不会阻止。它应该得到一个与独占/写锁相冲突的共享锁
这似乎是由于MVCC,但这是否意味着MVCC不遵守有关交易互动的教科书描述?
我在DELETE
而不是INSERT
答案 0 :(得分:1)
MVCC与传统锁有些不同,随便说:
如果您想要可扩展性,这是一个关键功能,因为它避免了很多争用。它有一个棘手的问题:在某些情况下,MVCC的行为并不像您可以直观地预期的那样。然而,MVCC太有用了,不能忽视,所以你只是了解它的细微差别。最典型的一个是您可以使用SERIALIZABLE
隔离级别并获得最终状态,这是您无法通过任何串行执行所涉及的事务获得的。
在您的特定情况下,SELECT
不会因为1而被阻止。但是,SELECT ... FOR UPDATE
会阻止,因为它充当了作家的“类型”,因此被其他作者阻止。
推荐链接: