2010-11-23 6 views
0

Я читал об операциях в MySQL, но я не мог понять одну проблему. Сделки - это способ гарантировать, что в блоке операторов либо все выполняется, либо ни одно из них. Тем не менее, делает ли транзакция «блокировку» строк, которые являются ее частью? То есть, скажем, у меня есть следующие утверждения (псевдо):Вопрос о транзакциях MySQL

1) START TRANSACTION 
2) SELECT row1 FROM table 
3) UPDATE table SET row1='new value' 
4) COMMIT 

Теперь, предположим, что пользователь попытался получить доступ к ROW1 в то время, когда система находилась на линии 3 выше .. Будет ли пользователь иметь доступ к ряду (а затем он может увидеть старое значение строки1), или ему придется ждать завершения транзакции, и только после этого строка будет извлечена с новым значением.

Спасибо! Joel

ответ

2

Нет, операции и изоляция - это две отдельные концепции.

Пять уровней изоляции:

  1. None
  2. Чтение совершено означает, что грязное чтение предотвращены; могут возникать не повторяющиеся чтения и фантомные чтения.
  3. Чтение uncommitted означает, что могут возникать грязные чтения, не повторяющиеся чтения и фантомные чтения.
  4. Повторяемое считывание означает, что предотвращаются грязные чтения и не повторяющиеся чтения; могут появляться фантомные чтения.
  5. Serializable означает, что предотвращаются грязные чтения, невоспроизводимые чтения и фантомные чтения.
0

Когда вы начинаете транзакцию, сделанные вами изменения становятся видимыми только после совершения транзакции. Это скорее изоляция, чем замок.

HTH

2

Это зависит. См. MySQL SELECT statement syntax, в частности FOR UPDATE и LOCK IN SHARE MODE.

«Если вы используете FOR UPDATE с механизмом хранения, который использует блокировку страниц или строк, строки, проверенные запросом, блокируются записью до конца текущей транзакции. Использование LOCK IN SHARE MODE устанавливает общую блокировку, которая разрешает другие транзакции для чтения рассмотренных строк, но не для их обновления или удаления ».

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