我有一个带有主键的表,它由唯一性约束支持。因此,具有SERIALIZABLE隔离的查询永远不应返回具有相同主键的两行。但对于使用READ COMMITTED隔离的查询,情况也是如此吗?什么是最不严格的隔离级别,明显重复的主键是不可能的?
答案 0 :(得分:2)
什么是明显重复的最松散的隔离级别 主键是不可能的?
REPEATABLE READ
或READ COMMITTED SNAPSHOT
在SQL Server中,READ COMMITTED
(锁定)扫描绝对可以读取一行两次。
在此隔离级别,只要读取数据就会释放行锁,而不是在语句或事务结束时释放。
因此,如果在初始读取之后更新密钥直到索引中的后面,则按键顺序读取索引的扫描可能再次遇到相同的行。为了在实践中观察重复的主键,被扫描的索引可能需要位于与PK本身不同的键列上。
如果尚未读取的数据在索引中向前移动到已扫描的部分, REPEATABLE READ
可能会错过行,但这不会允许出现明显重复主键的现象。
答案 1 :(得分:0)
在OracleDB上,只要PK不可延迟和延迟,就不能违反它:即使在支持的最低“READ COMMITTED”级别(ANSI / ISO Level 1)中,在同一行上运行的不同会话也会出现问题。行锁争用。因此,第二个会话的DML将保持等待直到第一次释放锁定 - 通过提交或回滚 - 然后它在运行中进行验证,如果违反PK则会失败。