我知道有关SqlTransactions和TransactionScopes的问题有很多,但是在Sqlconnections打开之后,我还没有看到使用TransactionScopes的任何示例。
我正在编写一个程序,该程序将具有多个SQL调用来更新数据库。这些命令根据逻辑工作块在多个事务中执行。即
using (SqlConnection conn = new SqlConnection(...))
{
conn.Open();
using(SqlTransaction tran = conn.BeginTransaction())
{
string sql = ...;
conn.Execute(sql, transaction: tran);
sql = ...;
conn.Execute(sql, transaction: tran)
tran.Commit();
}
using(SqlTransaction tran2 = conn.BeginTransaction())
{
string sql2 = ...;
conn.Execute(sql2, transaction: tran2);
sql2 = ...;
conn.Execute(sql2, transaction: tran2)
tran2.Commit();
}
}
根据我的阅读,一般而言,TransactionScope优于SqlTransaction,但在所有示例中,我都已经看到,在 SqlConnection之前初始化了TransactionScope。另外,根据注释on this answer,如果首先打开了连接,则必须将其加入事务中。我想知道在这种情况下坚持使用SqlTransactions是否更好,还是应该重构?
如果我应该重构,我可能会看到在每个事务中都有该连接(尽管我不确定某个连接是否可以被加入多个事务中,而且我甚至不确定是否可以进行这种操作使用TransactionScope作为TransactionScope.Transaction不存在,并且conn.EnlistTransaction(transactionScope)不起作用。),或者可能会反转using块以在每个事务中重新初始化连接。像这样:
using (TransactionScope scope = new TransactionScope())
{
using (SqlConnection conn = new SqlConnection(...))
{
string sql = ...;
conn.Execute(sql);
sql = ...;
conn.Execute(sq)
}
scope.Complete();
}
using (TransactionScope scope2 = new TransactionScope())
{
using (SqlConnection conn2 = new SqlConnection(...))
{
string sql2 = ...;
conn2.Execute(sql2);
sql2 = ...;
conn2.Execute(sql2)
}
scope2.Complete();
}
但是我不确定从资源管理的角度来看这会产生什么样的命中/帮助,因为连接将使用相同的connectionString。这会导致不必要的连接吗?对于这种性质的代码,是否有推荐的结构?
提前谢谢!