C#是否应该将Sql/OleDb transaction.Commit()放在for循环之外?
我有以下基本oledb循环: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
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已经指出的那样,它对数据库的性能也有巨大的影响,因为所有事务都会被记录下来。因此,更少的事务=更快的性能。我不理解交易范围问题。