Sql server SQL Server如果我们保持TRAN为SELECT和UPDATE打开,会有任何影响吗

Sql server SQL Server如果我们保持TRAN为SELECT和UPDATE打开,会有任何影响吗,sql-server,locking,Sql Server,Locking,我遇到了一个过程,其中事务一直保持打开状态,下面是代码片段 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' W

我遇到了一个过程,其中事务一直保持打开状态,下面是代码片段

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子句中的表。我计划仅在更新之前添加事务

下面的代码比上面的代码好吗

  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

如果有什么不同,请告诉我。

默认隔离级别应该是
READ COMMITTED
。如果未将
READ\u COMMITTED\u SNAPSHOT
设置为ON,则如果在另一个事务中完成了某些更新/删除/插入,您的选择可能会被阻止。这取决于使用了哪些锁,这取决于您触摸的数据

这两个状态应该相等,因为在不指定任何事务的情况下,SQL server会自行创建一个,并且应该使用默认的隔离级别

BEGIN TRAN
      UPDATE Table  SET Col1= 'Value' WHERE Col2=@Par1 AND Col3 = @Par4
COMMIT
毫无意义,因为默认情况下,
SQL Server
自动提交模式下运行,这意味着不需要在
begin tran
中包装单个
UPDATE
语句。
提交
,它将自动提交

原始代码打开一个
事务
,用于执行多个
更新
s,这意味着业务逻辑要求提交所有这些
更新
s,或者在出现问题时回滚所有

I would like to know if the above code will lock the tables which are in SELECT clause

这取决于您的
选择和表结构。如果您的表在
col2
col3
上有一个索引,并且您的
SELECT
s不接触相同的行或使用
readpass
将不会有冲突。

事务是用来提供索引的。在不知道这个逻辑在做什么的情况下,移动事务边界现在可能很容易打破任何一致性预期。(另外,在事务中封装一条语句也没有多大意义,因为SQL Server已经对打开的事务之外的每个DML语句进行了封装,并在默认情况下自动提交)事务始终存在。锁也总是存在的。对单个DML使用事务是没有意义的。同时,相同的事务范围应该尽可能小。因此,如果有多个DML,那么您是对的。您好,事务中存在多个UPDATE语句。我将更新这个问题。想象下面的sql:
开始事务选择*从表1中选择表1,其中表1.col1=1--中断--更新表1集合表1.col1=22,其中表1=1
执行到中断,然后在另一个窗口
更新表1集合col1=22,其中表1=1
中执行,得到相同的结果。在第一个事务中选择的结果已更改。正如在
readcommitted
中一样,共享锁在事务结束之前不会保持不变,这两条语句的行为应该相同。我的错误在哪里编辑:这是对现在缺失的评论的回答?感谢您的反馈…我们已将提交的快照作为隔离级别阅读。在出现上述代码片段的过程中,我们遇到了死锁问题。我想确认它可能是导致问题的原因。