如何处理如果DbTransaction';s Commit()或Rollback()引发异常
本文关键字:Commit Rollback 异常 何处理 处理 如果 DbTransaction | 更新日期: 2023-09-27 18:19:59
我使用的是Visual Studio 2012和MS SQL Server 2008 R2。
在我的代码中,我使用的是DbConnection
和DbTransaction
。这是我的代码:
DbConnection dbConnection = null;
DbTransaction dbTransaction = null;
try
{
dbConnection = DbProviderFactories.GetFactory("System.Data.SqlClient").CreateConnection();
dbConnection.ConnectionString = connectionString;
dbConnection.Open();
dbTransaction = dbConnection.BeginTransaction();
// do my work using dbConnection and dbTransaction
dbTransaction.Commit();
}
catch (MyWorkFailedException mwfe)
{
dbTransaction.Rollback();
throw;
}
finally
{
if (dbConnection != null)
{
dbConnection.Close();
dbConnection.Dispose();
}
}
dbTransaction.Commit();
或dbTransaction.Rollback();
是否可能抛出异常?
如果是,那么如何在我的代码中处理它?c#程序员通常是如何处理这种情况的?或者他们不能处理这种情况?
是的,Commit
和Rollback
都可以抛出异常。但是,这些可能应该向上传播并记录或显示为错误给用户。如何处理错误完全取决于您,但通常情况下,错误是由关闭的连接引起的。其次,您应该利用using
using (var dbConnection = DbProviderFactories.GetFactory("System.Data.SqlClient").CreateConnection())
{
dbConnection.ConnectionString = connectionString;
dbConnection.Open();
using (var dbTransaction = dbConnection.BeginTransaction())
{
//Do work here
dbTransaction.Commit();
}
}
DbTransaction
将自动回滚其dispose方法(假设尚未提交)。此代码引发的异常通常不是您可以优雅处理的。在大多数情况下,它们可能来自SQL错误(无效语法、FK错误等)或关闭的连接。
只要您有一个好的日志记录系统,上面的代码就应该是您所需要的。
使用只有Complete()
的TransactionScope
。一旦它被释放,它将回滚基础事务。任何异常都会导致底层事务也被回滚:
using (var scope = new TransactionScope())
using (var connection = new SqlConnection(...))
{
// do stuff
scope.Complete();
}
您将任何方法(Commit
和Rollback
)中的异常处理为事务中的失败。如果你想/必须这样做,你可以清理你的C#代码中的一些东西。数据库清理将自动处理(至少对于ACID兼容的数据库)。