【问题标题】:Does TRANSACTION ISOLATIoN LEVEL SERIALIZABLE create READ lockTRANSACTION ISOLATION LEVEL SERIALIZABLE 是否创建读锁
【发布时间】:2015-04-26 13:41:51
【问题描述】:

对于什么应该是简单的问题,我似乎找不到直接的答案。如果我在 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

【问题讨论】:

    标签: sql sql-server tsql transactions


    【解决方案1】:

    TRUNCATE TABLE 将在表上获得 exclusive shema modify 锁,防止所有用户从表中读取 (除非他们使用 TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 或 @ 987654323@) 并写入表格(写入没有例外)。排他锁将在COMMIT TRANSACTION释放。

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

    【讨论】:

    • NOLOCK 仍然不允许读取该表。它仍然需要一个模式稳定性锁。 Truncate 需要一个 `Sch-M` 锁来阻止它。
    【解决方案2】:

    是的,它会锁定表,这些是可序列化的规则:

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 2013-06-05
      • 1970-01-01
      相关资源
      最近更新 更多