首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择“防止返回的行被删除”吗?

选择“防止返回的行被删除”吗?
EN

Stack Overflow用户
提问于 2018-02-16 04:22:45
回答 1查看 519关注 0票数 1

说我有:

  1. T1:SELECT id FROM x WHERE timestamp < y (返回id = [1, 2, 3])
  2. T2:DELETE FROM x WHERE id = 1
  3. T1:SELECT timestamp, value FROM x WHERE id = 1

READ-COMMITTED隔离。

步骤3是否有返回空结果的风险,或者步骤1是否获得某种阻止步骤2更改结果的锁/快照?(我猜想REPEATABLE-READ会做我想做的事情,但这个问题是关于READ-COMMITTED的)。

我使用postgresql,但我感兴趣的是一个独立于DB的答案。例如,如果某些数据库阻止删除,而其他数据库则不阻止,我想知道这一点。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-16 05:35:33

The PostgreSQL case:

在PostgreSQL中,读取行不会获得防止并发删除行的锁:

  • 如果T2在步骤3之前提交,T1将看到其结果并返回一个空的结果集。
  • 如果步骤3在T2提交之前运行,则T2的结果还不可见,查询将返回匹配的行。

一般情况:

数据库系统提供事务隔离的方式各不相同,其行为将因所使用的方法而有所不同。

  • 某些数据库系统(如DB2或Microsoft )在读取行时会锁定行,以防止并发更新。 在这样的数据库系统上,DELETE将阻塞,并且该行在步骤3中是可见的。
  • 大多数数据库系统使用某种类型的多版本控制,即当修改行的事务正在进行时,它们将保留旧版本的行。 在这样的数据库系统上,DELETE不会被阻塞,步骤3的结果将取决于是否已经提交了T2。

A解决方案:

如果您正在寻找使所有数据库系统上的行为具有确定性的解决方案,则可以使用更高的隔离级别,也可以通过在步骤1的SELECT语句中指定SELECT语句来使用悲观锁定。然后步骤2将始终阻塞。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48820045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档