我正在使用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#程序员通常如何处理这种情况?或者他们不处理这种情况?
答案 0 :(得分:3)
是的,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错误等)或封闭连接。
只要你有一个好的测井系统,上面的代码应该就是你所需要的。
答案 1 :(得分:1)
您可以将任何方法(Commit
和Rollback
)中的异常处理为事务中的失败。如果您需要/必须,您可以清理C#代码中的内容。数据库清理将自动处理(至少对于符合ACID标准的数据库)。
答案 2 :(得分:1)
使用只有TransactionScope
的{{1}}。处置后,它将回滚基础交易。任何异常都会导致基础事务回滚:
Complete()