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