SQL Server:可序列化级别不工作

SQL Server:可序列化级别不工作,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我有以下SP: CREATE PROCEDURE [dbo].[sp_LockReader] AS BEGIN SET NOCOUNT ON; begin try set transaction isolation level serializable begin tran select * from teste commit tran end try begin catch rollback tran set transaction isola

我有以下SP:

CREATE PROCEDURE [dbo].[sp_LockReader]  
AS  
BEGIN  
SET NOCOUNT ON;  
begin try   
set transaction isolation level serializable  
begin tran  
select * from teste  
commit tran  
end try  
begin catch  
rollback tran  
set transaction isolation level READ COMMITTED  
end catch  
set transaction isolation level READ COMMITTED  
END  
表test有许多值,因此从teste中选择*需要几秒钟。我在两个不同的查询窗口中同时运行sp_LockReader,第二个窗口开始显示测试表内容,而第一个窗口没有终止

序列化级别不应该强制第二个查询等待吗? 如何获得所描述的行为?
谢谢,最基本的方法是可以序列化,可以长时间保持锁定。选择时,保留的锁是一个共享锁,允许其他读卡器使用

如果要阻止读卡器,请使用WITH TABLOCKX hint在不需要序列化的位置获取独占锁。或可序列化的XLOCK

换言之:

SERIALIZABLE=隔离级别=锁定持续时间,并发性 XLOCK=模式=共享/独家 TABLOCK=粒度=锁定的内容

TABLOCKX=组合


可序列化最基本的方法是将锁保留更长时间。选择时,保留的锁是一个共享锁,允许其他读卡器使用

如果要阻止读卡器,请使用WITH TABLOCKX hint在不需要序列化的位置获取独占锁。或可序列化的XLOCK

换言之:

SERIALIZABLE=隔离级别=锁定持续时间,并发性 XLOCK=模式=共享/独家 TABLOCK=粒度=锁定的内容

TABLOCKX=组合


其输出不受其他并发事务影响的可序列化事务。在您的情况下,您将从表中选择两次;这两个事务都不会更改另一个事务的结果集,因此它们可以同时运行

即使一个事务更新了表,这也不一定会阻止另一个事务执行,因为数据库可能通过快照工作


请看这里,以获得比我能提供的更好的解释

其输出不受其他并发事务影响的可序列化事务。在您的情况下,您将从表中选择两次;这两个事务都不会更改另一个事务的结果集,因此它们可以同时运行

即使一个事务更新了表,这也不一定会阻止另一个事务执行,因为数据库可能通过快照工作


请看这里,以获得比我能提供的更好的解释

这里还有一个注释。如果您在可序列化隔离下使用XLOCK,那么其他具有读取提交隔离的事务仍将能够读取XLOCK的行

要防止出现这种情况,请将PAGLOCK与XLOCK一起使用。 详情请参见此处

这里还有一个注释。如果您在可序列化隔离下使用XLOCK,那么其他具有读取提交隔离的事务仍将能够读取XLOCK的行

要防止出现这种情况,请将PAGLOCK与XLOCK一起使用。 详情请参见此处

KB文章似乎只适用于SQL Server 2000。我敢肯定现在大多数人至少已经升级到2005年了。是的,乔丹,你说得对。它确实成功地阻止了读提交事务。我用2008 R2测试了它。在两种情况下,当行被XLOCK'ed时,对其他连接授予读访问权限—未提交的读上为-1,快照上为2。但是,阻止了带有XLOCK的快照。KB文章似乎仅适用于SQL Server 2000。我敢肯定现在大多数人至少已经升级到2005年了。是的,乔丹,你说得对。它确实成功地阻止了读提交事务。我用2008 R2测试了它。在两种情况下,当行被XLOCK'ed时,对其他连接授予读访问权限—未提交的读上为-1,快照上为2。但是,已阻止带有XLOCK的快照。