我遇到了一些包含在事务中的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();
}
我正在尝试在事务中执行一些插入语句,但如果一个失败,则所有内容都会自动回滚。我知道在大多数情况下,在我的场景中需要这种行为,如果一些语句没有成功则无关紧要。交易存在的原因是为了提高速度。我知道批量插入,但不幸的是我不能在这里使用它,所以这是我必须使用的。你能否告诉我是否可以禁用我描述的这种行为?
答案 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)
好的伙计们,感谢您对此提供的所有有用信息。我想我将不得不留下这样的东西,等待微软将来添加这个功能,如果他们这样做的话。