我们有场景:
- SQL Server 2008
- 我们在数据库上有复制
- 我们有一个简单的 sproc,它执行表之一的 ALTER(添加新列)
- 隔离级别是默认的(READ COMMITTED)
存储过程失败并出现错误:
您只能在 READ COMMITTED 或 REPEATABLE READ 隔离级别中指定 READPAST 锁
问题:
- 是什么导致了问题?
- 如何解决?
更新: 我相信这是一个非常普遍的问题,所以我想知道为什么没有很好的解释为什么复制会导致这个问题
我们有场景:
存储过程失败并出现错误:
您只能在 READ COMMITTED 或 REPEATABLE READ 隔离级别中指定 READPAST 锁
问题:
更新: 我相信这是一个非常普遍的问题,所以我想知道为什么没有很好的解释为什么复制会导致这个问题
您确定隔离级别设置为 READ COMMITTED 吗?
当隔离设置为可序列化并且您在为复制而发布的表上使用 ALTER TABLE 时,我已经看到此错误。这是因为某些复制存储过程使用 READPAST 提示来避免阻塞,该提示只能用于 READ COMMITTED 或 REPEATABLE READ 隔离级别。
如果您确定隔离级别设置为 READ COMMITTED,那么我建议您联系 Microsoft PSS,因为它不应该发生。他们将能够更好地帮助您。
从提交的数据中读取时,您不能只指定 READPAST。
原因是因为 readpast 忽略了锁定的行,所以当你使用它时,你几乎是在对 sql server 说,给我所有其他事务没有触及的东西。来自 BOL 的示例:
例如,假设表 T1 包含一个整数列,其值为 1、2、3、4、5。如果事务 A 将值 3 更改为 8 但尚未提交,则 SELECT * FROM T1 (READPAST) 会产生值 1、2、4、5。
说在读取未提交的隔离级别上没有多大意义,默认情况下,它会带回未提交的值。它有点要求两个相反的东西。
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
//REST OF QUERY ADD WITH (READPAST) after the table names Ex. SELECT FOO.* FROM dbo.foobar FOO WITH (READPAST)
和/或这应该可以帮助你。