我遇到了一个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 Server
在autocommit mode
中操作,这意味着不需要在begin tran
中包装单个UPDATE
语句。。commit
,它将自动提交。
原始代码为执行多个update
s打开了一个transaction
,这意味着业务逻辑需要提交所有这些update
s,或者如果出现问题,则需要回滚全部。
I would like to know if the above code will lock the tables which are in SELECT clause
这取决于您的SELECT
和表结构。如果您的表在col2
或col3
上有索引,并且您的SELECT
不接触相同的行或使用readpast
,则不会发生冲突。