Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这是TransactionScope的正确用法吗?_C#_Mysql_Sql_Database_Transactionscope - Fatal编程技术网

C# 这是TransactionScope的正确用法吗?

C# 这是TransactionScope的正确用法吗?,c#,mysql,sql,database,transactionscope,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

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

不,这不是正确的用法

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

using (var transaction = new System.Transactions.TransactionScope())
{
  using (var connection = new MySqlConnection())
  {
     ...
  }
}
如果在作用域之前创建连接,则即使在创建作用域之后创建命令,该连接也将超出该作用域

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

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

}

如果您没有使用线程,我看不出有任何问题:)@Jan'splite'Kondelík我最担心的是,当我使用SqlTransaction对象时,我曾经专门将该对象传递到MySqlCommand对象的参数中。但对于这个新的scope对象,这些都没有。交易是否按照预期的方式执行,所以?正如GSerg在回答中所写,我忽略了您没有创建连接(+1到他的答案;))谢谢-这正是我所寻找的。你能详细解释一下最后一段代码吗?我还没有完全理解。作用域控制着。使用
TransactionScope
的默认构造函数类似于使用
设置事务隔离级别SERIALIZABLE
。您通常不希望这样(前提是您知道自己在做什么;否则可序列化实际上可能对您有好处)。常见的隔离级别是
readcommitted
。您可以使用TransactionScope构造函数的此重载请求该级别。