sql-server - SQL Server 2008事务,需要回滚吗?

标签 sql-server tsql transactions rollback

我有一个包含 BEGIN TRANSACTIONCOMMIT 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/

相关文章:

c# - 如何处理 TransactionInDoubtException

php - 在 PHP 中到处使用准备好的语句? (PDO)

sql - 选择期间不重叠的日期范围

sql-server - 从 DateTime sql server 2005 中删除时间

sql-server - 何时需要在 try catch block 中检查 @@trancount > 0 ?

sql - 高效的 Ad-hoc SQL OLAP 结构

sql - 有没有一种方法可以将多个更新查询合并到一个查询中?

sql-server - 如何在 SQL Server 查询的 FROM 子句中使用变量?

sql - 使用BIGINT的TSQL算术溢出

java - Wildfly 和 MySQL 的不可重复读隔离级别