如果我们将SELECT和UPDATE的TRAN保持打开状态,SQL Server是否会有任何影响

时间:2018-07-25 07:03:32

标签: sql-server locking

我遇到了一个打开TRANSACTION的程序,这是代码段

BEGIN TRAN
--Lot of select queries to process the business logic, lets assume 30 seconds to generate the @Par3 and @Par4 as they are having XML data

   IF 1= 1
        BEGIN
            UPDATE Table  SET Col1= 'Value' WHERE Col2=@Par1 AND Col3 = @Par4
            UPDATE Table2  SET Col5= 'Value' WHERE Col2=@Par1 AND Col3 = @Par4
        END
   COMMIT

我想知道上面的代码是否会锁定SELECT子句中的表。我打算仅在UPDATE之前添加TRANSACTION。

下面的代码是否比上面的代码好

  BEGIN
       --Lot of select queries to process the business logic, lets assume 30 seconds to generate the @Par3 and @Par4 as they are having XML data
       IF 1= 1
          BEGIN
              BEGIN TRAN
                    UPDATE Table  SET Col1= 'Value' WHERE Col2=@Par1 AND Col3 = @Par4
                    UPDATE Table2  SET Col5= 'Value' WHERE Col2=@Par1 AND Col3 = @Par4
                    COMMIT
          END

请让我知道是否有任何区别。

2 个答案:

答案 0 :(得分:0)

默认隔离级别应为READ COMMITTED。在READ_COMMITTED_SNAPSHOT未设置为ON的情况下,如果在其他事务中完成了一些更新/删除/插入,则您的选择可能会被阻止。这取决于所使用的锁,取决于您触摸的数据。

两个状态菜单都应该相等,而不指定任何事务,SQL Server会自行创建一个,并应使用默认的隔离级别。

答案 1 :(得分:0)

BEGIN TRAN
      UPDATE Table  SET Col1= 'Value' WHERE Col2=@Par1 AND Col3 = @Par4
COMMIT

完全没有意义,因为默认情况下SQL Serverautocommit mode中运行,这意味着不需要在UPDATE中包装单个begin tran语句。.{{ 1}},它将自动提交。

原始代码打开一个commit来执行多个 transaction,这意味着业务逻辑需要所有update如果出现问题,请提交或全部回滚。

update

这取决于您的I would like to know if the above code will lock the tables which are in SELECT clause 和表结构。如果您的表在SELECTcol2上有一个索引,而您的col3不接触相同的行或使用SELECT,则不会有冲突。