TRANSACTION ISOLATION LEVEL SERIALIZABLE 是否创建 READ 锁

Does TRANSACTION ISOLATIoN LEVEL SERIALIZABLE create READ lock

对于什么应该是一个简单的问题,我似乎找不到一个直接的答案。如果我在 T-SQL 中创建一个事务并将 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

是的,它将锁定 table,这些是可序列化的规则:

  • 语句无法读取已修改但尚未被其他事务提交的数据。
  • 在当前事务完成之前,其他事务不能修改当前事务已读取的数据。
  • 在当前事务完成之前,其他事务无法插入其键值落在当前事务中任何语句读取的键范围内的新行。

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

TRUNCATE TABLE 将在 table 上获得 独占 shema 修改 锁,防止所有用户读取table (除非他们使用 TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDWITH(NOLOCK) 并写入 table(写入也不例外)。独占锁将在 COMMIT TRANSACTION.

释放

编辑: 正如 Martin Smith 在下面的评论中指出的那样,截断 table 将获得模式修改锁。这意味着在提交或回滚发生之前,任何其他用户都无法读取或修改 table。