2015-08-31 19 views
0

Я решил попробовать использовать TransactionScope, а не класс SqlTransaction.Правильное ли использование TransactionSope?

Ниже мой код, завернутый в 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(); 
} 

код работает, но я не связывание MySqlCommandcmd объекта сделки в любой момент. Это проблема?

+0

Если вы не используете темы, я не вижу никаких проблем :) –

+0

@ Jan'splite'Kondelík Мое самое большое беспокойство в том, что, когда я с помощью SqlTransaction объект, я специально передавал этот объект в параметры объекта MySqlCommand. Но с этим новым объектом области не существует ничего. Выполняется ли транзакция так, как это предполагается, так? –

+1

Как писал GSerg в ответ, я не заметил, что вы не создаете соединение (+1 к его ответу;)) –

ответ

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 })) 
{ 

} 
+0

Спасибо - это именно то, что я искал. Не могли бы вы рассказать о последнем фрагменте кода, поскольку я не понял полностью? –

+0

Область управления [уровень изоляции транзакции] (https://dev.mysql.com/doc/refman/5.0/en/set-transaction.html). Использование конструктора по умолчанию для «TransactionScope» аналогично использованию «УСТАНОВЛЕННЫЙ УРОВЕНЬ ИЗОЛЯЦИИ УСТАНОВКИ». Вы часто этого не хотите (если вы знаете, что делаете, потому что иначе Serializable может на самом деле вам хорошо). Общий уровень изоляции - «READ COMMITTED». Вы запрашиваете этот уровень, используя эту перегрузку конструктора TransactionScope. – GSerg

+0

Хорошо понял - спасибо! –

Смежные вопросы