SQL Server如果我们为SELECT和UPDATE保持TRAN打开,会有什么影响吗



我遇到了一个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子句中的表。我计划只在更新之前添加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

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

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

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

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

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

原始代码为执行多个updates打开了一个transaction,这意味着业务逻辑需要提交所有这些updates,或者如果出现问题,则需要回滚全部

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

这取决于您的SELECT和表结构。如果您的表在col2col3上有索引,并且您的SELECT不接触相同的行或使用readpast,则不会发生冲突。

相关内容

最新更新