建立SqlConnection后的SqlTransaction vs TransactionScope

时间:2019-03-25 01:03:26

标签: c# transactionscope sqltransaction

我知道有关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。这会导致不必要的连接吗?对于这种性质的代码,是否有推荐的结构?

提前谢谢!

0 个答案:

没有答案