我有一个具有主键的表,该主键由唯一性约束支持。因此,具有SERIALIZABLE隔离的查询不应返回具有相同主键的两行。但对于具有READ COMMITTED隔离的查询也是如此吗?不可能存在明显的重复主键的最宽松的隔离级别是什么?
发布于 2013-10-31 00:33:44
不可能存在明显的重复主键的最宽松的隔离级别是什么?
REPEATABLE READ或READ COMMITTED SNAPSHOT
在SQL Server中,在READ COMMITTED (锁定)时扫描读取一行两次是完全可能的。
在此隔离级别中,行锁在读取数据时立即释放,而不是在语句或事务结束时释放。
因此,如果在初始读取之后更新了键,则按键顺序读取索引的扫描可能会再次遇到相同的行,将其移动到索引中的后面。为了在实践中观察到重复的主键,被扫描的索引可能需要位于与PK本身不同的键列上。
如果尚未读取的数据在索引中向前移动到已扫描的部分,则REPEATABLE READ可能会遗漏行,但这不允许出现明显的重复主键现象。
发布于 2013-10-31 00:59:58
在OracleDB上,只要你的PK是不可延迟和延迟的,你就不能违反它:即使在最低支持的“读提交”级别(ANSI/ISO级别1),操作相同行的不同会话也会导致行锁争用。因此,第二个会话的DML将一直等待,直到第一次释放锁-通过提交或回滚-然后它会动态验证,如果PK被违反,它将失败。
https://stackoverflow.com/questions/19687493
复制相似问题