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
中的回滚。所以我猜如果我想能够回滚我的所有更改,我会希望循环完全 运行,然后提交它?
我也刚刚了解了 TransactionScope
s,它概述了使用中的 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?"
好吧,每次迭代执行一个事务的唯一原因是您希望提交所有未失败的插入,即使其中一些插入失败的情况非常不可能发生。 (在这种情况下,您还需要进行一些异常处理。)
如果您没有这样的要求,并且您不介意数量级的性能提升,那么您最好启动一个事务,执行循环,然后关闭事务。
我有以下基本的 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
s,它概述了使用中的 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?"
好吧,每次迭代执行一个事务的唯一原因是您希望提交所有未失败的插入,即使其中一些插入失败的情况非常不可能发生。 (在这种情况下,您还需要进行一些异常处理。)
如果您没有这样的要求,并且您不介意数量级的性能提升,那么您最好启动一个事务,执行循环,然后关闭事务。