【问题标题】:Is this correct usage of TransactionSope?这是 TransactionSope 的正确用法吗?
【发布时间】:2015-08-31 09:53:33
【问题描述】:

我决定尝试使用TransactionScope,而不是SqlTransaction 类。

以下是我的代码,包裹在TransactionScope中:

using (var transaction = new System.Transactions.TransactionScope())
{
    using (MySqlCommand cmd = new MySqlCommand(sql, connection))
    {
        if (listParameters != null && listParameters.Count > 0)
        {
            foreach (string currentKey in listParameters.Keys)
            {
                cmd.Parameters.Add(new MySqlParameter(currentKey, GetDictionaryValue(listParameters, currentKey)));
            }
        }

        using (MySqlDataReader reader = cmd.ExecuteReader())
        {
            dtResults.Load(reader);
        }
    }

    transaction.Complete();
}

代码有效,但是我在任何时候都没有将MySqlCommand cmd 对象与事务绑定。这是个问题吗?

【问题讨论】:

  • 如果你不使用线程,我看不出有什么问题:)
  • @Jan'splite'Kondelík 我最担心的是,当我使用 SqlTransaction 对象时,我曾经专门将此对象传递给 MySqlCommand 对象的参数。但是有了这个新的作用域对象,就没有这些了。交易是否按预期执行,所以?
  • 正如 GSerg 在回答中所写,我忽略了你没有创建连接(+1 到他的回答;))

标签: c# mysql sql database transactionscope


【解决方案1】:

不,这不是正确的用法。

正确的用法是在创建TransactionScope之后再创建连接。然后连接将检测环境 TransactionScope 并自行登记。

using (var transaction = new System.Transactions.TransactionScope())
{
  using (var connection = new MySqlConnection())
  {
     ...
  }
}

如果您在作用域之前创建连接,则该连接将超出该作用域,即使您在创建作用域之后创建命令也是如此。

还要注意 TransactionScope 默认为 Serializable 级别的隔离。这是最安全的级别,但也是并发最少的级别。您通常希望显式设置更常见的隔离级别:

using (var transaction = new TransactionScope(
             TransactionScopeOption.Required,
             new TransactionOptions() { IsolationLevel = IsolationLevel.ReadCommitted  }))
{ 

}

【讨论】:

  • 谢谢 - 这正是我想要的。您能否详细说明最后一个代码 sn-p,因为我还没有完全理解?
  • 范围控制transaction isolation level。使用TransactionScope 的默认构造函数就像使用SET TRANSACTION ISOLATION LEVEL SERIALIZABLE。您通常不希望这样做(前提是您知道自己在做什么;否则 Serializable 可能实际上对您有好处)。常见的隔离级别是READ COMMITTED。您使用 TransactionScope 构造函数的此重载请求该级别。
猜你喜欢
  • 2015-06-03
  • 2021-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多