从C#执行SQL查询时自动回滚

时间:2009-09-13 09:40:24

标签: c# sql-server tsql transactions

我遇到了一些包含在事务中的SQL查询的问题。这是代码的样子:

using (SqlTransaction dbTrans = conn.BeginTransaction())

{

using (SqlCommand cmd = conn.CreateCommand())

{

  for(Parameters p in parameterList)
  try

  {
      //execute insert commmand
  }
  catch
  {
      //log exception
      //SQL server rolls back everything
      //even though no rollback statement is present!!!
  }

}

dbTrans.Commit();

}

我正在尝试在事务中执行一些插入语句,但如果一个失败,则所有内容都会自动回滚。我知道在大多数情况下,在我的场景中需要这种行为,如果一些语句没有成功则无关紧要。交易存在的原因是为了提高速度。我知道批量插入,但不幸的是我不能在这里使用它,所以这是我必须使用的。你能否告诉我是否可以禁用我描述的这种行为?

6 个答案:

答案 0 :(得分:1)

基本上你想要使用没有全部或全部的交易。这根本不可能。我的博客有post on various ways of speeding up inserts。它可能对你有用。

答案 1 :(得分:1)

我认为“全有或全无”是交易的默认行为,您无法对其进行更改,仅选择交易速度是不正确的。

您必须优化代码使用优化类并最大限度地减少数据库访问次数。

为什么你不能使用SqlBulkCopy类?你能提供更多细节吗

答案 2 :(得分:1)

SQL实际上不会回滚所有内容。这一切都取决于引发的错误。有些错误会中止当前事务,有些则不会。例如,密钥违规错误中止事务,您可以安全地继续执行。有关引擎错误严重性的详细信息,请参阅Database Engine Error Severities

要研究的一件事是您的应用程序是否正在更改默认的SET XACT_ABORT设置。当此设置为ON 时,任何错误都将导致事务中止。默认为OFF。

答案 3 :(得分:0)

您可以以永不失败的方式编写insert命令。例如:

insert into table1 (id, name) values (1,'charles')
where not exists (select * from table1 where id=1)

答案 4 :(得分:0)

这是数据库事务的本质,它是为了确保原子性。如果INSERT操作失败,则事务必须回滚。

答案 5 :(得分:0)

好的伙计们,感谢您对此提供的所有有用信息。我想我将不得不留下这样的东西,等待微软将来添加这个功能,如果他们这样做的话。