首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ADO.NET事务中使用()块

在ADO.NET事务中使用()块
EN

Stack Overflow用户
提问于 2014-09-01 09:49:17
回答 1查看 390关注 0票数 1

我需要进行一个相对琐碎的事务,但是这应该会影响5-6个表,所以我学习了几个教程,介绍了如何做到这一点,因为我以前从未使用过事务,我在using(...)块中打包了每个新的查询,如下所示:

代码语言:javascript
复制
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块代价高昂,如果在执行过程中某个地方抛出了一个异常,那么其他代码仍然会被执行,更重要的是,transaction.Commit();也会被抛出。这使得事务毫无用处,因为当我想要一个事务(全部或不需要)时,我会得到部分更改的database

由于我在这个问题上缺乏经验,我想知道怎样才能正确地处理这种情况。在其中一个示例中,有一个bool标志指示当前操作的执行情况,在调用transaction.Commit();之前,需要进行某种检查:

代码语言:javascript
复制
if (!hasErrors)
{
  transaction.Commit();
}

但是,由于我在事务中包含了服务器表,而且我有一个用于获取信息或检查某些内容的查询,所以使用标志的想法并不是很诱人。我正在考虑删除using()块,这样(至少我认为这是应该发生的),每当抛出错误时,我就直接转到主要的catch块。所以..。有一些想法,但实际的处理方法是什么呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-01 10:08:58

我已经修改了您的代码,包括了所有命令的公共事务。

代码语言:javascript
复制
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();
  } 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25603089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档