说我有:
SELECT id FROM x WHERE timestamp < y (返回id = [1, 2, 3])DELETE FROM x WHERE id = 1SELECT timestamp, value FROM x WHERE id = 1用READ-COMMITTED隔离。
步骤3是否有返回空结果的风险,或者步骤1是否获得某种阻止步骤2更改结果的锁/快照?(我猜想REPEATABLE-READ会做我想做的事情,但这个问题是关于READ-COMMITTED的)。
我使用postgresql,但我感兴趣的是一个独立于DB的答案。例如,如果某些数据库阻止删除,而其他数据库则不阻止,我想知道这一点。谢谢。
发布于 2018-02-16 05:35:33
The PostgreSQL case:
在PostgreSQL中,读取行不会获得防止并发删除行的锁:
一般情况:
数据库系统提供事务隔离的方式各不相同,其行为将因所使用的方法而有所不同。
DELETE将阻塞,并且该行在步骤3中是可见的。DELETE不会被阻塞,步骤3的结果将取决于是否已经提交了T2。A解决方案:
如果您正在寻找使所有数据库系统上的行为具有确定性的解决方案,则可以使用更高的隔离级别,也可以通过在步骤1的SELECT语句中指定SELECT语句来使用悲观锁定。然后步骤2将始终阻塞。
https://stackoverflow.com/questions/48820045
复制相似问题