1

我有一个带有主键的表,它由唯一性约束支持。因此,具有 SERIALIZABLE 隔离的查询永远不应返回具有相同主键的两行。但是对于具有 READ COMMITTED 隔离的查询也是如此吗?什么是最宽松的隔离级别,不可能出现明显的重复主键?

4

2 回答 2

2

什么是最宽松的隔离级别,不可能出现明显的重复主键?

REPEATABLE READ或者READ COMMITTED SNAPSHOT

在 SQL Server 中,绝对有可能进行一次扫描READ COMMITTED(锁定)以读取一行两次。

在此隔离级别,行锁在读取数据后立即释放,而不是在语句或事务结束时释放。

因此,如果在初始读取之后更新了键,则按键顺序读取索引的扫描可能会再次遇到同一行,直到索引中的稍后位置。为了在实践中观察重复的主键,被扫描的索引可能需要位于与 PK 本身不同的键列上。

REPEATABLE READ如果尚未读取的数据在索引中向前移动到已扫描的部分,则可能会丢失行,但这不会允许出现明显重复主键的现象。

于 2013-10-30T16:33:43.517 回答
0

在 OracleDB 上,就您的 PK 不可延迟和延迟而言,您不能违反它:即使在支持的最低“READ COMMITTED”级别(ANSI/ISO 级别 1)中,在同一行上运行的不同会话也会发生在行锁中争论。因此,第二个会话的 DML 将一直等待,直到第一次释放锁——通过提交或回滚——然后它会被即时验证,如果违反 PK 它将失败。

于 2013-10-30T16:59:57.703 回答