Read Commited 标准行为中是否存在重复项?

kan*_*kan 1 sql-server isolation-level sql-standard

这是指这个问题:Duplicate records returned from table with no duplicates

“读提交”隔离级别假定一个事务可以以不同的方式读取同一条记录,但并不明确暗示记录可以重复。我同意同一事务中的两个语句可以返回不同的数据集,但返回带有重复记录的相同数据集听起来很疯狂。

据我所知,只有 MS SQL Server 有这种行为。

如果它符合ANSI SQL 标准定义的“Read Committed”隔离级别,请证明或反驳。

Pau*_*ite 6

SQL 标准隔离级别定义(可能是故意的)不精确。它们是根据允许的并发现象给出的:

  • P1 - 脏读
  • P2 - 不可重复读取
  • P3 - 幻影

READ COMMITTED隔离,只有P1是不允许的。

摘自 ISO/IEC 9075-2 摘自 ISO/IEC 9075-2

因此,不允许由于物理结构内的移动而多次读取“相同记录”,只要每次读取不是脏读取(即对提交的数据执行读取)。

因此,SQL Server 对READ COMMITTED隔离的锁定实现符合标准。

我理解这种行为可能令人惊讶,但这种惊讶的根源在于误解了此隔离级别可以保证和不能保证什么。例如,人们可能期望并发UPDATE永远不会更改SELECT查询返回的记录数。这是一种合理的期望,但不是必须满足才能符合标准的期望。

如果您想要数据的时间点(稳定)视图,锁定已提交读不是您需要的隔离级别实现。虽然标准没有强制要求,但使用行版本控制 (RCSI) 提交的读恰好提供了数据库提交状态的语句级时间点一致视图。对于数据库已提交状态的事务级时间点一致视图,您需要快照隔离 (SI)。

据我所知,只有 MS SQL Server 有这种行为。

在使用锁(特别是用于读取的短期锁)实现读提交的任何数据库中,并且并发修改可能导致记录移动到当前扫描位置之前的任何数据库中都是可能的。换句话说,它是特定于实现的。

相关阅读: