SET XACT_ABORT ON在存储过程中使用有什么好处?
如果你小心并且在所有内容周围使用TRY-CATCH,并且你真的需要使用以下错误回滚:
SET XACT_ABORT ON
Run Code Online (Sandbox Code Playgroud)
换句话说,是否有任何错误,TRY-CATCH将错过SET XACT_ABORT ON将处理?
在下面的代码中,如果在执行SQL语句时抛出任何异常,我们应该期望在事务未提交时对事务进行隐式回滚,它会超出范围并被处置掉:
using (DbTransaction tran = conn.BeginTransaction())
{
//
// Execute SQL statements here...
//
tran.Commit();
}
Run Code Online (Sandbox Code Playgroud)
以上是一种可接受的做法,还是应该捕获异常并显式调用tran.Rollback(),如下所示:
using (DbTransaction tran = conn.BeginTransaction())
{
try
{
//
// Execute SQL statements here...
//
tran.Commit();
}
catch
{
tran.Rollback();
throw;
}
}
Run Code Online (Sandbox Code Playgroud) 可能重复:
连接关闭时未提交的事务会发生什么?
如果在交易过程中丢失连接会发生什么?
我想如果事务永远不会提交并且可以再次执行,但是...有没有办法我可以连接并将其回滚到保存的点并继续我已经拥有的东西?
亲切的问候.
可能重复:
连接关闭时未提交的事务会发生什么?
我知道SqlTransaction会自行回滚Dispose()(如果出现错误,请参阅使用语句回滚数据库事务吗?),但是当它的父SqlConnection处理时它会被回滚吗?