Если кому-то интересно, вот как TransactionOptions влияет на MySql:
Допустим, у меня есть два метода.
Method1 запускает транзакцию, выбирает строку из моей таблицы, увеличивает значение и обновляет таблицу.
Метод2 такой же, но между выбором и обновлением я добавил сон в 1000 мс.
Теперь представьте, что у меня есть следующий код:
Private Sub Button1_Click(sender as Object, e as System.EventArgs) Handles Button1.Click
Dim thread1 As New Threading.Thread(AddressOf Method1)
Dim thread2 As New Threading.Thread(AddressOf Method2)
thread2.Start() // I start thread 2 first, because this one sleeps
thread1.Start()
End Sub
Без транзакций это произойдет:
запускается thread2, читает значение 5, затем спит,
поток1 запускается, читает значение 5, обновляет значение до 6,
thread2 также обновляет значение до 6.
Эффект: у меня есть уникальный номер два раза.
Что я хочу:
Thread2 запускается, читает значение 5, затем спит,
thread1 запускается, пытается прочитать значение, но получает блокировку и спит,
thread2 обновляет значение до 6,
thread1 продолжается, читает значение 6, обновляет значение до 7
Вот как начать транзакцию с TransactionScope:
TransactionOptions Opts = new TransactionOptions();
Opts.IsolationLevel = IsolationLevel.ReadUncommitted;
// start Transaction
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew, Opts))
{
// Do your work and call complete
ts.Complete();
}
Это может даже управлять распределенными транзакциями. Если генерируется исключение, ts.Complete никогда не вызывается, а часть области действия Dispose () выполняет откат транзакции.
Вот краткий обзор того, как различные уровни IsolationLevels влияют на транзакцию:
- IsolationLevel.Chaos
Выдает исключение NotSupportedException - уровень изоляции Хаоса не поддерживается
- IsolationLevel.ReadCommited
Транзакции не мешают друг другу (два одинаковых чтения, плохо)
- IsolationLevel.ReadUncommitted
Транзакции не мешают друг другу (два одинаковых чтения, плохо)
- IsolationLevel.RepeatableRead
Транзакции не мешают друг другу (два одинаковых чтения, плохо)
- IsolationLevel.Serializable
Выдает MySqlException - обнаружена тупиковая ситуация при попытке получить блокировку; попробуйте перезапустить транзакцию во время обновления
- IsolationLevel.Snapshot
Выдает MySqlException - у вас есть ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с '' в строке 1 во время соединения. Open ()
- IsolationLevel.Unspecified
Выдает MySqlException - обнаружена тупиковая ситуация при попытке получить блокировку; попробуйте перезапустить транзакцию во время обновления
- TransactionOptions не задан
Выдает MySqlException - обнаружена тупиковая ситуация при попытке получить блокировку; попробуйте перезапустить транзакцию во время обновления