2015-02-24 77 views
1

我似乎无法找到一个简单的答案,应该是一个简单的问题。如果我在T-SQL中创建一个事务并将ISOLATION LEVEL设置为SERIALIZABLE,这是否会在我正在修改的表上创建一个READ锁定?是否TRANSACTION ISOLATION LEVEL SERIALIZABLE创建READ锁

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; 
GO 
BEGIN TRANSACTION; 
GO  
TRUNCATE TABLE TBL_PRODUCTS; 
GO 
    **INSERT RECORDS HERE** 
GO 
    COMMIT TRANSACTION; 
GO 

回答

1

TRUNCATE TABLE将获得 独家 玛修改锁在桌子上防止所有用户从表 阅读(除非他们使用 TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDWITH(NOLOCK)和写入表(写作没有例外)。独家锁定将在COMMIT TRANSACTION发布。

编辑:正如Martin Smith在他下面的评论中指出的那样,truncate表会获得一个schema修改锁。这意味着没有其他用户将能够读取或修改表,直到发生提交或回滚。

+0

'NOLOCK'仍然不允许读取表。它仍然需要模式稳定性锁定。截断需要一个'Sch-M'来锁定这个锁。 – 2015-02-24 19:38:37

0

是的,这将锁定表,这些都是规则序列化:

  • 声明不能读取已修改但其他事务尚未提交的数据。
  • 没有其他事务可以修改当前事务读取的数据,直到当前事务完成。
  • 其他事务不能插入具有键值的新行,这些键值落在当前事务中任何语句读取的键的范围内,直到当前事务完成。

https://msdn.microsoft.com/en-us/library/ms173763.aspx

相关问题