在面对一些具有挑战性的并发问题时,我意识到自己并不知道这个问题的答案,并且会重视任何反馈,这让我感到惊讶。
想象一下我们称之为 Bob 的交易,执行以下操作:
UPDATE Foo SET value='A' WHERE value='B'
COMMIT;
第二个交易我们称之为 Alice ,与Bob并行运行,执行以下操作:
UPDATE Bar SET value='X' WHERE value='Y'
COMMIT;
我们无法预测Alice和Bob完成的顺序。
现在想象另外两个交易, Carol 和 Dan ,以READ COMMITTED
(或更高)隔离级别运行。它们与Alice和Bob并行运行,以便他们可能会或者可能不会"看到"爱丽丝或鲍勃的影响。他们都执行以下操作:
SELECT Foo.value, Bar.value FROM Foo, Bar;
是否可能在一次运行中可能会发生以下情况:
Foo.value = 'A'
和Bar.value = 'Y'
(Alice已提交,Bob未提交)Foo.value = 'B'
和Bar.value = 'X'
(Bob承诺,Alice未承诺)也就是说,他们是否可能只看到一个交易的影响,但看到不同的 - 或者换句话说,他们认为交易发生的顺序不同?
两者都是逻辑上可序列化的结果,可以说是原子的,一致的 和孤立的观点。
这种行为可能会因SERIALIZABLE
和READ COMMITTED
而有所不同吗?那些不同的平台(例如Oracle,PostGres,SQL Server,MySQL和H2)。