我有以下基本的oledb循环:
using (OleDbConnection conn = new OleDbConnection(Con))
{
using (OleDbCommand cmd = new OleDbCommand())
{
for loop
{
cmd.Connection = conn;
conn.Open();
transaction = conn.BeginTransaction(IsolationLevel.ReadCommitted);
cmd.CommandText = "row by row insert"
cmd.Some parameters, then ExecuteNonQuery
transaction.Commit();
}
}
}
但是,我不确定在命令执行后是否应该将Commit
放在循环中。毕竟说完了之后我应该把它放好吗?概述using
将是try catch
,其中包含catch
中的回滚。所以我猜测我是否希望能够回滚所有更改,我希望循环完全运行,然后提交它?
我刚刚了解了TransactionScope
概述了使用中的SQL上下文,所以我也想知道它是如何应用的。
答案 0 :(得分:2)
当Commit()
调用在循环内时,您无法将BeginTransaction()
调用移出循环。两者都将保持在循环中,或者两者都将在循环之外。
所以,你的问题应该是:"我应该在每次迭代循环中执行一个事务,还是应该启动事务,执行循环,然后提交事务?"
嗯,每次迭代执行一个事务的唯一原因是,即使其中一些插入失败,您也希望提交所有非失败的插入。 (在这种情况下,您还需要进行一些异常处理。)
如果您没有这样的要求,并且如果您不介意数量级的性能提升,那么您最好先启动交易,进行循环,然后关闭交易。