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

C#是否应该将Sql/OleDb transaction.Commit()放在for循环之外?,c#,transactions,transactionscope,C#,Transactions,Transactionscope,我有以下基本oledb循环: using (OleDbConnection conn = new OleDbConnection(Con)) { using (OleDbCommand cmd = new OleDbCommand()) { for loop { cmd.Connection = conn; conn.Open(); transaction = conn.BeginTransacti

我有以下基本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
放在循环中。我应该把它放在说了做了之后吗?使用概述
将是一个
try catch
,在
catch
中包含回滚。所以我猜如果我想回滚我所有的更改,我会希望循环完全运行,然后提交它


我还刚刚了解了
TransactionScope
s,它在using中概述了SQL上下文,因此我也想知道它如何应用于该上下文。

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

因此,您的问题应该是:“我应该在循环的每个迭代中执行一个事务,还是应该启动一个事务,执行循环,然后提交该事务?”

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


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

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

因此,您的问题应该是:“我应该在循环的每个迭代中执行一个事务,还是应该启动一个事务,执行循环,然后提交该事务?”

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


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

取决于您的要求。如果一个命令失败,是否应该重置所有
INSERT
命令?是的,我想是这样。因此,如果它在循环中,最多的捕获将回滚将是添加的最后一行?另外,我正在尝试使用TransactionScope,我添加了引用,我假设这将适用于任何与平台无关的数据库?因为我看不到任何地方可以定义它@Janesabouchleightly,您的代码现在只会重置最后一次插入的事务。如果将其置于循环之外(使用
conn.BeginTransaction(IsolationLevel.ReadCommitted);
当然),它将重置此事务/for循环中处理的所有
INSERT
命令。但是现在,在处理
transaction.Rollback()
的地方仍然缺少一些异常处理。欧元:正如@Mike Nakis已经指出的那样,它对数据库的性能也有巨大的影响,因为所有事务都会被记录下来。因此,更少的事务=更快的性能。我不明白
交易范围
问题。取决于您的要求。如果一个命令失败,是否应该重置所有
INSERT
命令?是的,我想是这样。因此,如果它在循环中,最多的捕获将回滚将是添加的最后一行?另外,我正在尝试使用TransactionScope,我添加了引用,我假设这将适用于任何与平台无关的数据库?因为我看不到任何地方可以定义它@Janesabouchleightly,您的代码现在只会重置最后一次插入的事务。如果将其置于循环之外(使用
conn.BeginTransaction(IsolationLevel.ReadCommitted);
当然),它将重置此事务/for循环中处理的所有
INSERT
命令。但是现在,在处理
transaction.Rollback()
的地方仍然缺少一些异常处理。欧元:正如@Mike Nakis已经指出的那样,它对数据库的性能也有巨大的影响,因为所有事务都会被记录下来。因此,更少的事务=更快的性能。我不理解
交易范围
问题。