Я читал о транзакциях в MySQL, но я не мог понять одну проблему. Транзакции - это способ обеспечить, чтобы в блоке операторов выполнялись либо все, либо ни одно из них. Тем не менее, делает ли транзакция "блокировку" строк, которые являются ее частью? То есть, скажем, у меня есть следующие утверждения (псевдо):
1) START TRANSACTION
2) SELECT row1 FROM table
3) UPDATE table SET row1='new value'
4) COMMIT
Теперь скажем, пользователь попытался получить доступ к строке1 в то время, когда система была в строке 3. выше. Будет ли у этого пользователя доступ к строке (а затем он может увидеть старое значение строки1), или он будет иметь дождаться завершения транзакции, и только после этого строка будет извлечена с новым значением.
Спасибо! Joel
Нет, транзакции и изоляция - это две отдельные концепции.
Пять уровней изоляции:
Это зависит. См. синтаксис инструкции MySQL SELECT, в частности FOR UPDATE
и LOCK IN SHARE MODE
.
"Если вы используете FOR UPDATE с механизмом хранения, в котором используются блокировки страниц или строк, строки, проверенные по запросу, блокируются записью до конца текущей транзакции. Использование LOCK IN SHARE MODE устанавливает общую блокировку, которая допускает другие транзакции для чтения рассмотренных строк, но не для их обновления или удаления".
когда вы начинаете транзакцию, сделанные вами изменения становятся видимыми только после совершения транзакции. Это скорее изоляция, чем блокировка.
HTH