这是TransactionSope的正确用法吗?

时间:2015-08-31 09:53:33

标签: c# mysql sql database transactionscope

我决定尝试使用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对象与事务绑定。这是一个问题吗?

1 个答案:

答案 0 :(得分:2)

不,这不是正确的用途。

正确的用法是在创建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  }))
{ 

}