【问题标题】:Locking when inserting in SQL Server Express 2014在 SQL Server Express 2014 中插入时锁定
【发布时间】:2016-02-04 10:36:46
【问题描述】:

我有一个表,其中有一个名为 Time 的列,类型为 datetime2。

我需要运行整个查询,而其他人在执行时不读取或更改表中的数据。

IF NOT EXISTS (SELECT Id FROM Bookings WHERE Time >= '2016-02-02 09:00:00' AND Time < '2016-02-02 11:00:00') BEGIN -- Insert some data END

查询位于 asp.NET 应用程序的事务中,但我不确定这是否足够。我需要应用锁定提示或设置隔离级别吗?如果是这样,我该怎么做?

我读过 TABLOCK,它似乎在做我想做的事,但它是不是有点矫枉过正?我在哪里可以指定整个查询需要一个 TABLOCK 而不仅仅是 select 语句?

【问题讨论】:

    标签: sql-server locking transaction-isolation


    【解决方案1】:

    因此,您不希望任何其他事务插入时间值介于“2016-02-02 09:00:00”和“2016-02-02 11:00:00”之间的行。您不应该使用 TABLOCK,因为这会将共享锁放在整个表上。这样做将不允许从其他事务中插入、更新和删除。您只想阻止时间范围。在您的选择语句中使用表提示 - Holdlock -

        IF NOT EXISTS (SELECT Id FROM Bookings with (holdlock)
        WHERE Time >= '2016-02-02 09:00:00' AND Time < '2016-02-02 11:00:00') 
          BEGIN 
          -- Insert some data 
          END
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多