对于READ COMMITTED隔离,是否可以复制主键?

时间:2013-10-30 15:45:42

标签: sql isolation-level

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

2 个答案:

答案 0 :(得分:2)

  

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

REPEATABLE READREAD COMMITTED SNAPSHOT

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

在此隔离级别,只要读取数据就会释放行锁,而不是在语句或事务结束时释放。

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

如果尚未读取的数据在索引中向前移动到已扫描的部分,

REPEATABLE READ可能会错过行,但这不会允许出现明显重复主键的现象。

答案 1 :(得分:0)

在OracleDB上,只要PK不可延迟和延迟,就不能违反它:即使在支持的最低“READ COMMITTED”级别(ANSI / ISO Level 1)中,在同一行上运行的不同会话也会出现问题。行锁争用。因此,第二个会话的DML将保持等待直到第一次释放锁定 - 通过提交或回滚 - 然后它在运行中进行验证,如果违反PK则会失败。