C#我应该在for循环之外放置Sql / OleDb transaction.Commit()吗?

时间:2017-06-16 06:51:38

标签: c# transactions transactionscope

我有以下基本的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上下文,所以我也想知道它是如何应用的。

1 个答案:

答案 0 :(得分:2)

Commit()调用在循环内时,您无法将BeginTransaction()调用移出循环。两者都将保持在循环中,或者两者都将在循环之外。

所以,你的问题应该是:"我应该在每次迭代循环中执行一个事务,还是应该启动事务,执行循环,然后提交事务?"

嗯,每次迭代执行一个事务的唯一原因是,即使其中一些插入失败,您也希望提交所有非失败的插入。 (在这种情况下,您还需要进行一些异常处理。)

如果您没有这样的要求,并且如果您不介意数量级的性能提升,那么您最好先启动交易,进行循环,然后关闭交易。