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

C# 从C执行SQL查询时自动回滚#,c#,sql-server,tsql,transactions,C#,Sql Server,Tsql,Transactions,我对一些封装在事务中的SQL查询有问题。下面是代码的样子: using (SqlTransaction dbTrans = conn.BeginTransaction()) { } 我试图在事务中执行一些insert语句,但如果其中一条语句失败,所有语句都会自动回滚。我知道,在大多数情况下,这种行为是我的场景中所需要的,如果有几个语句不起作用,那也没关系。事务存在的原因是为了提高速度。我知道批量插入,但不幸的是我不能在这里使用它,所以这是我必须处理的问题。您能告诉我是否可以禁用我描述的这种行为

我对一些封装在事务中的SQL查询有问题。下面是代码的样子:

using (SqlTransaction dbTrans = conn.BeginTransaction())
{

}


我试图在事务中执行一些insert语句,但如果其中一条语句失败,所有语句都会自动回滚。我知道,在大多数情况下,这种行为是我的场景中所需要的,如果有几个语句不起作用,那也没关系。事务存在的原因是为了提高速度。我知道批量插入,但不幸的是我不能在这里使用它,所以这是我必须处理的问题。您能告诉我是否可以禁用我描述的这种行为吗?

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

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

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

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

基本上,您希望使用事务,而不是全部或全部。这根本不可能。我的博客有一个新的主题。它可能对您很有用。

基本上,您希望使用事务,而不必使用全部或全部。这根本不可能。我的博客有一个新的主题。它可能对您有用。

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

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

我认为“要么全部,要么什么都不做”是事务的默认行为,您不能对其进行更改,并且仅为速度选择事务是不正确的

您必须使用优化的类优化代码,并尽量减少数据库访问次数

第二件事为什么不能使用SqlBulkCopy类??您能否提供更多详细信息

我认为“全部或无”是事务的默认行为,您不能更改它,仅为速度选择事务是不正确的

您必须使用优化的类优化代码,并尽量减少数据库访问次数


第二件事为什么不能使用SqlBulkCopy类??您能提供更多详细信息吗?SQL实际上并不回滚所有内容。这完全取决于所引发的错误。有些错误会中止当前事务,有些则不会。例如,密钥冲突错误不会中止事务,您可以安全地继续执行。有关引擎错误严重性的详细信息,请参阅


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

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


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

好的,伙计们,谢谢你们在这方面的所有有用的输入。我想我将不得不离开这样的事情,等待微软在将来添加这个功能,如果他们真的这样做的话。

好的,伙计们,谢谢你们在这方面的所有有用的输入。我想我将不得不离开这样的事情,等待微软在将来添加此功能,如果他们真的这样做的话。

这就是我感到恼火的地方,SQL Server认为某些错误比其他错误更严重。开发者应该有决定的自由。XACT_ABORT默认为关闭状态,因此这不是问题。我觉得这很烦人,SQL Server认为某些错误比其他错误更严重。开发者应该有决定的自由。默认情况下XACT_ABORT处于关闭状态,因此这不是问题。我无法使用BulkCopy,因为应用程序需要独立于数据库引擎,并且afaik SqlBulkCopy仅适用于SQL Server。@ASDF-只需通过允许不同的可插拔策略来考虑该功能。您不必使用最小公分母方法。我不能使用BulkCopy,因为应用程序需要独立于数据库引擎,而afaik SqlBulkCopy仅适用于SQL Server。@ASDF-只需通过允许不同的可插入策略来考虑该功能即可。您不必使用最小公分母方法。我同意您的看法,这应该是默认行为,但开发人员也应该有权在需要时在少数情况下关闭它。@ASDF:对我来说,关闭事务与在自己的事务中执行每条语句没有什么不同(SQL Server的自动事务,或多或少)。我理解提高性能的必要性,但有不止一种方法可以剥猫皮。我同意你的看法,这应该是默认行为,但开发人员也应该有权在需要时在罕见的情况下关闭它。@ASDF:对我来说,关闭事务与使用在其自己的事务中(SQL Server的自动事务,或多或少)。我理解提高性能的必要性,但剥猫皮的方法不止一种。我查看了你的博客,但正如你所说,使用类可能有风险。我已经在使用参数化命令,只是更改参数的值,但我希望事务会加快速度。太糟糕了,它是这样设计的。耶s-但回滚的可能性肯定很小吗?我查看了你的博客,但正如你所说,使用类可能会有风险。我已经在使用参数化命令,只是更改了参数的值,但我希望事务会加快速度。这样设计太糟糕了。是的,但回滚的可能性肯定很大?