我有一个包含 BEGIN TRANSACTION
和 COMMIT TRANSACTION
语句的存储过程。事务内有一个选择查询WITH(XLOCK, ROWLOCK)
。
如果提供超出范围的值,交易可能会因某些计算导致算术溢出错误而失败。此错误会在任何插入/更新语句之前发生。
我的问题是,我应该将事务包装在 TRY/CATCH 中并回滚吗?或者这并不是真正需要的,并且如果事务失败,所有锁都会自动释放?我唯一担心的是,如果事务失败,SQL 不会释放事务的所有锁。
谢谢
汤姆
最佳答案
更简单的方法是:
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 等。第一段的单次运行将重置所有事务。
关于sql-server - SQL Server 2008事务,需要回滚吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3997271/