【发布时间】:2018-07-26 23:10:37
【问题描述】:
说我有:
- T1:
SELECT id FROM x WHERE timestamp < y(返回id = [1, 2, 3]) - T2:
DELETE FROM x WHERE id = 1 - T1:
SELECT timestamp, value FROM x WHERE id = 1
与READ-COMMITTED 隔离。
第 3 步是否存在返回空结果的风险,或者第 1 步是否会获取某种锁定/快照以防止第 2 步更改结果? (我假设REPEATABLE-READ 会做我想做的事,但这个问题是关于READ-COMMITTED)。
我正在使用 postgresql,但我对独立于 DB 的答案感兴趣。例如,如果某些数据库阻止删除而其他数据库不阻止,我想知道这一点。谢谢。
【问题讨论】:
-
它确实取决于 DBMS 及其设置。例如,在 SQL Server 中,您可以打开和关闭
SNAPSHOT ISOLATION。在没有具体提示的情况下,步骤 1 中的简单SELECT不应阻止 T2 删除该行。 (我假设第 2 步在第 1 步完成后运行,事务 T1 尚未结束的事实并不重要) -
@VladimirBaranov 谢谢。
REPEATABLE-READ会阻止 T2 删除该行(或至少将其从我的快照中隐藏),对吗? -
抱歉,我对那个隔离级别没有太多经验。
SERIALIZABLE绝对足够了。不同的 DBMS 实现的隔离级别可能略有不同,因此您最好查看 DBMS 的文档 -
对于 SQL Server
REPEATABLE READ看起来足够生活。 “指定语句不能读取已被其他事务修改但尚未提交的数据,并且在当前事务完成之前,没有其他事务可以修改当前事务已读取的数据。共享锁被放置在每个读取的所有数据上事务中的语句并一直保留到事务完成。这可以防止其他事务修改当前事务已读取的任何行。" 对于 Postgres,请参阅其文档
标签: sql postgresql database-locking read-committed