c# - DbTransaction 的Commit() 或Rollback() 抛出异常如何处理?

标签 c# sql-server transactions

我正在使用 Visual Studio 2012 和 MS SQL Server 2008 R2。

在我的代码中,我使用了 DbConnectionDbTransaction。这是我的代码:

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#程序员通常如何处理这种情况?或者他们不处理这种情况?

最佳答案

是的,CommitRollback 都可以 抛出异常。但是,这些可能应该向上传播并记录或作为错误显示给用户。您希望如何处理错误完全取决于您,但通常错误是由于连接关闭造成的。其次,您应该利用 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 错误等)或关闭的连接。

只要你有一个好的日志系统,上面的代码应该就是你所需要的。

关于c# - DbTransaction 的Commit() 或Rollback() 抛出异常如何处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33425748/

相关文章:

c# - 如何检查对字符串路径的访问是否被拒绝?

c# - SignalR 客户端断开连接并不总是触发

sql-server - Sql Server - 避免延迟编译

mysql - sql子查询解释

java - WebSphere MQ wmq.jmsra 在 MDB 中出现异常后循环

c# - 按值查找 Xml 属性,并更改其其他值

c# - 如何使用 C# 在通用 Windows 应用程序中包含计时器

sql - 如何更改 SQL Server 中的日期并设置该月的最后一天(如果该月不存在该天)

php - MySQL 事务是否锁定正在更新和/或选择的 InnoDB 中的行

database - 使用存储函数创建数据库