【问题标题】:What type of SQL locks could be involved in the following queries executed inside of a TransactionScope which is ReadCommited?在 ReadCommited 的 TransactionScope 内执行的以下查询可能涉及哪种类型的 SQL 锁?
【发布时间】:2017-11-01 16:05:37
【问题描述】:

所以我们有四个陈述(为了问题的目的而改变)

它们在TransactionScope (ReadCommitted) 中运行,多个进程可以同时调用包含这些语句的同一个存储过程:

SELECT @BathroomId = B.BathroomId
FROM Bathrooms B
WHERE B.BathroomSuite = @BathroomSuite AND B.SuiteIsAvailable = 1  
(No indexes used at all)

SELECT @OrderReceiptId = O.OrderReceiptId
FROM Order O 
WHERE O.OrderId = @OrderId 
(Clustered Index) 

IF ISNULL(@OrderReceiptId, -1) = -1
BEGIN
    INSERT INTO [dbo].[OrderReceipt]
        .....
    (Clustered index on PK) 

    UPDATE Order 
    SET OrderReceiptId = @@SCOPE_IDENTITY
    WHERE OrderId = @OrderId

从我有限的阅读中,我了解到只有行锁应该用于 SELECTS(因此,限制了对这些表的争用的影响)

但是,那么,INSERT/UPDATE 将使用什么锁,这对其他与总体事务竞争的进程有什么影响?

在事务完成之前,我们是否有效地控制了这些表?或者只是一些表(即只有 INSERT 和 UPDATE - 因为在我看来,事务实际上只与 INSERT 和 UPDATE 相关(例如,不能回滚 SELECT)

其他竞争进程是否必须等到事务完成(我认为这当然不是不合理的)

数据库锁定和事务关系有些模糊,因为这会影响包含这些语句的存储过程的多个调用者。

注意请忽略 Order 和 OrderReceipt 之间的狡猾关系,这绝对是次优的。

我认为我将事务作为一种锁定机制(有点像用于线程同步的线程锁)和数据库级锁定混为一谈

编辑:是的,我将事务和数据库锁定(一起使用但职责略有不同)混为一谈,任何 google 101 网站都会告诉我这一点。这很尴尬,但它会教会我没有先喝水。

【问题讨论】:

  • 您使用的是什么 DBMS?如果是 SQL Server,答案可能取决于您的快照隔离级别...
  • @OlaBerntsson SQL 服务器。

标签: c# sql transactions locking transactionscope


【解决方案1】:

如果您使用的是 SQL Server,这可能取决于您的快照隔离级别。

据我所知,在聚集索引中插入一些东西会锁定整个表。换句话说,第一个插入将阻塞所有其他插入,直到完成。阅读 (SELECT) 是另一回事:

检查数据库的属性/选项,查找“Is read committed snapshot on”。如果此设置为 True,则并发进程可以在您持有该插入事务时读取。如果不是 - 所有其他读取将被阻止,直到事务完成。

请注意,在某些情况下,打开此选项可能会影响数据库性能,尽管我个人对此没有任何实际问题。

【讨论】:

    【解决方案2】:

    如果有多个进程调用同一个SP,则不会发生争用或锁定,阻塞..

    您的选择在您所在的隔离级别中获取共享锁,并且该锁将在读取该行后立即释放

    但是如果有一些更新进程或删除进程试图同时访问表,你可能会看到锁定、阻塞。

    你也可以使用这个traceflag to see all the locks taken ..这个跟踪标志将把锁写到消息标签中

    DBCC TRACEON(1200,3604,-1);
    SELECT ....
    DBCC TRACEOFF(1200,3604,-1);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-26
      • 2012-10-29
      • 1970-01-01
      • 1970-01-01
      • 2012-08-15
      • 2018-07-20
      • 1970-01-01
      相关资源
      最近更新 更多