我遇到了一个打开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
请让我知道是否有任何区别。
答案 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 Server
在autocommit 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
和表结构。如果您的表在SELECT
或col2
上有一个索引,而您的col3
不接触相同的行或使用SELECT
,则不会有冲突。