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

C# Should I place the Sql/OleDb transaction.Commit() outside of a for loop?

我有以下基本的 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 中的回滚。所以我猜如果我想能够回滚我的所有更改,我会希望循环完全 运行,然后提交它?

我也刚刚了解了 TransactionScopes,它概述了使用中的 SQL 上下文,所以我也想知道它如何适用于此。

BeginTransaction() 调用在循环内时,您不能将 Commit() 调用移到循环外。两者要么都留在循环中,要么都离开循环。

所以,你的问题应该是:"should I perform one transaction per iteration of my loop, or should I start a transaction, do my loop, and then commit the transaction?"

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

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