在ADO.NET事务期间使用using()块

时间:2014-09-01 09:49:17

标签: c# transactions ado.net

我需要做一个相对简单的事务,但是应该影响5-6个表,所以我通过几个关于如何执行此操作的教程,因为我之前从未使用过事务,并且我已经忙着包装每个新查询在using(...)块中,像这样:

SqlTransaction transaction = null;
SqlConnection connection = null;
string localConnString =System.Web.Configuration.WebConfigurationManager..;
try
{
  connection = new SqlConnection(localConnString);
  connection.Open();

  string insertSomeValues = "some SQL INSERT query"..
  using (SqlCommand command = new SqlCommand(insertSomeValues, connection))
  {   
    ..
  }
  using(SqlCommand newCommand = new SqlCommand(otherQuery, connection))
  {
    ..
  }
  transaction.Commit();
}
catch
{
  transaction.Rollback();
}
finally
{
  connection.Close();
}

所以我希望你明白了。我认为这个实现存在的问题是,由于using块在某个地方被抛出异常,因此try-catch块处于pricatice transaction.Commit();块,其他代码仍然会被执行,更重要的是database也是。这使得交易无用,因为当我想要一个交易(全部或全部)时,我最终会部分更改bool

由于我对这个主题缺乏经验,我想知道正确处理这种情况的方法是什么。在其中一个示例中,有一个transaction.Commit();标志,指示当前操作如何进行,并在调用if (!hasErrors) { transaction.Commit(); } 之前进行某种检查:

using()

但是由于我在我的事务中包含了几个表,并且我有一些用于获取信息或检查某些内容的查询,因此使用标志的想法并不是很诱人。我正在考虑删除{{1}}块,以便(至少我认为应该发生的事情)每当抛出错误时我直接进入主catch块。那么..有一些想法,但处理这个问题的实际方法是什么?

1 个答案:

答案 0 :(得分:0)

我修改了你的代码,通过包含所有命令的公共事务。

SqlTransaction transaction = null;
SqlConnection connection = null;

string localConnString =System.Web.Configuration.WebConfigurationManager..;
try
{
 connection = new SqlConnection(localConnString);
 connection.Open();
 transaction=connection.BeginTransaction();
 string insertSomeValues = "some SQL INSERT query"..
 using (SqlCommand command = new SqlCommand(insertSomeValues, connection,transaction))
 {   
  ..
 }
 using(SqlCommand newCommand = new SqlCommand(otherQuery, connection,transaction))
 {
  ..
 }
 transaction.Commit();
  }
  catch
 {
  transaction.Rollback();
  }
  finally
  {
    connection.Close();
  }