我有一个存储过程BEGIN TRANSACTION
and COMMIT TRANSACTION
陈述。事务中是一个选择查询WITH(XLOCK, ROWLOCK)
.
如果提供超出范围的值,则由于某些计算会导致算术溢出错误,交易可能会失败。此错误会在任何插入/更新语句之前发生。
我的问题是,我应该将事务包装在 TRY/CATCH 中并回滚吗?或者这并不是真正需要的,并且如果事务失败,所有锁都会自动释放?我唯一担心的是,如果事务失败,SQL 不会释放事务的所有锁。
Thanks,
Tom
一个更简单的方法是:
set xact_abort on
这将导致事务在发生错误时自动回滚。
示例代码:
set xact_abort on
begin transaction
select 1/0
go
print @@trancount -- Prints 0
set xact_abort off
begin transaction
select 1/0
go
print @@trancount -- Prints 1
如果多次执行第二段,您将看到事务计数增加到 2、3、4 等。第一段的单次运行将重置所有事务。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)