新连接的READPAST锁定问题

Laj*_*pad 2 vb.net sql-server locking

我有一个存储过程,如下所示:

USE [DBName]
GO
/****** Object:  StoredProcedure [dbo].[ProcName]    Script Date: 10/03/2012 12:10:16 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[ProcName](@filter bigint, @n int)
AS
DELETE FROM TableName WITH (READPAST, UPDLOCK, ROWLOCK) OUTPUT(DELETED.ColumnName2)
WHERE TableName.ID in (select top (@n) ID from TableName where TableName.ColumnName1 = @filter)
Run Code Online (Sandbox Code Playgroud)

此过程返回ColumnName2的第一个@n值(这些值表示的记录将从表中删除).我从vb方法使用这个存储过程,它通常运行良好.但是,有时,由于我不知道的原因,它会引发异常:

You can only specify the READPAST lock in the READ COMMITTED or REPEATABLE READ isolation levels.
Run Code Online (Sandbox Code Playgroud)

我的vb方法调用此存储过程,如果它没有获得足够的值,则它会生成新值并调用此存储过程.重复此过程,直到有足够的值.从本质上讲,TableName就像一个队列,我的vb方法运行良好,但是,有时会抛出上面提到的异常.是什么导致这个问题以及我的问题的解决方案是什么?

我试图为调用我的存储过程的代码启动一个新的连接,但没有用,因为再次抛出异常.我不知道可能是什么解决方案,尽管我已阅读以下文章:

http://www.red-gate.com/messageboard/viewtopic.php?t=13614

调用存储过程时出现.NET READPAST锁定错误

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

http://blogs.technet.com/b/claudia_silva/archive/2011/08/08/replication-error-quot-you-can-only-specify-the-readpast-lock-in-the-read-committed-或可重复读取隔离的水平-QUOT生成-时-改变出版表-columns.aspx

预先感谢您的任何帮助,

LajosÁrpád.

Ric*_*iwi 10

这应该可以解决您的问题

ALTER PROCEDURE [dbo].[ProcName](@filter bigint, @n int)
AS
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
DELETE FROM TableName WITH (READPAST, UPDLOCK, ROWLOCK) OUTPUT(DELETED.ColumnName2)
WHERE TableName.ID in (select top (@n) ID from TableName where TableName.ColumnName1 = @filter)
Run Code Online (Sandbox Code Playgroud)

由于您使用的是需要此设置的READPAST,因此您可以在SP中明确地设置它,因为它是安全范围的.

如果在存储过程或触发器中发出SET TRANSACTION ISOLATION LEVEL,则当对象返回控件时,隔离级别将重置为调用对象时生效的级别.

参考:SET TRANSACTION ISOLATION LEVEL

至于它为什么会发生,可能的原因是SQL调用之间的连接池和混合事务隔离级别.