如果可序列化事務干擾另一個隔離級別,是否可能出現異常?
讓我們假設事務 A 執行
SERIALIZABLE
,事務 B 執行在更寬鬆的隔離級別,例如READ UNCOMMITTED
. 事務 A 現在可以遭受事務 B 引入的任何異常嗎?我找到了這個SO question,但答案沒有提供該資訊。我僅了解同類場景的參考手冊頁:
保證任何一組並發的可序列化事務將具有與一次執行一個事務相同的效果,這意味著如果您可以證明單個事務(如所寫)在自行執行時會做正確的事情,您可以相信它將在任何可序列化事務的組合中做正確的事情
我在SQL 草案中發現這些引用表明
SERIALIZABLE
事務確實不會受到其他隔離級別事務引起的任何異常的影響:CD 9075-1:200x(E) 第 27 頁:
最高隔離級別SERIALIZABLE 保證可序列化執行,這意味著在時間上重疊的SQL 事務的效果與它們在時間上不重疊時的效果相同。
CD 9075-2:200x(E) 第 124 頁:
SQL 會話中的 SQL 事務對 SQL 數據或模式所做的更改可能會被同一 SQL 會話中的該 SQL 事務、其他 SQL 事務或其他 SQL 中的同一 SQL 事務感知-sessions,在隔離級別 READ UNCOMMITTED,但在前一個 SQL 事務以 .
這就是標準。但是這些實現在現實中是怎麼做的呢?我對 Postgres 和 MySQL 的定義行為特別感興趣。
PostgreSQL wiki https://wiki.postgresql.org/wiki/Serializable#PostgreSQL_Implementation狀態:
在 SERIALIZABLE 之外的事務隔離級別上執行的任何事務都不會受到 SSI 的影響。如果你想通過 SSI 強制執行業務規則,所有事務都應該在 SERIALIZABLE 事務隔離級別上執行,並且應該設置為預設值。
在您的範例中,由於事務 A 和 B 都不是 SERIALIZABLE,因此可能會發生異常。