2

我们有场景:

  • SQL Server 2008
  • 我们在数据库上有复制
  • 我们有一个简单的 sproc,它执行表之一的 ALTER(添加新列)
  • 隔离级别是默认的(READ COMMITTED)

存储过程失败并出现错误:

您只能在 READ COMMITTED 或 REPEATABLE READ 隔离级别中指定 READPAST 锁

问题:

  • 是什么导致了问题?
  • 如何解决?

更新: 我相信这是一个非常普遍的问题,所以我想知道为什么没有很好的解释为什么复制会导致这个问题

4

3 回答 3

1

您确定隔离级别设置为 READ COMMITTED 吗?

当隔离设置为可序列化并且您在为复制而发布的表上使用 ALTER TABLE 时,我已经看到此错误。这是因为某些复制存储过程使用 READPAST 提示来避免阻塞,该提示只能用于 READ COMMITTED 或 REPEATABLE READ 隔离级别。

如果您确定隔离级别设置为 READ COMMITTED,那么我建议您联系 Microsoft PSS,因为它不应该发生。他们将能够更好地帮助您。

于 2012-05-08T16:30:59.153 回答
1

从提交的数据中读取时,您不能只指定 READPAST。

原因是因为 readpast 忽略了锁定的行,所以当你使用它时,你几乎是在对 sql server 说,给我所有其他事务没有触及的东西。来自 BOL 的示例:

例如,假设表 T1 包含一个整数列,其值为 1、2、3、4、5。如果事务 A 将值 3 更改为 8 但尚未提交,则 SELECT * FROM T1 (READPAST) 会产生值 1、2、4、5。

说在读取未提交的隔离级别上没有多大意义,默认情况下,它会带回未提交的值。它有点要求两个相反的东西。

于 2012-05-08T15:17:46.387 回答
1
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)

和/或这应该可以帮助你。

http://support.microsoft.com/kb/981995

于 2012-05-08T15:11:39.120 回答