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构造函数的此重载请求该级别。