Поскольку речь идет о MySQL и транзакциях, весь ответ касается InnoDB, хотя большая его часть действительна для любого механизма хранения, поддерживающего транзакции.
Блокировка транзакции зависит от механизма хранения и от уровень изоляции транзакции .MySQL / InnoDB использует управление версиями строк для реализации транзакций и снижает количество блокировок, используемых на всех уровнях изоляции, кроме сериализуемых.Уровень изоляции по умолчанию в MySQL - повторяемое чтение.
Обычно обновления используют блокировки записи, что означает, что другая транзакция не может обновить ту же строку, но может прочитать ее.Если вы попытаетесь получить доступ к заблокированной строке, MySQL будет ожидать истечения времени ожидания блокировки, а затем завершит запрос, сообщив, что истекло время ожидания блокировки.Обычно этого не должно происходить.Однако наиболее опасной частью использования транзакций является введение dead-locks
- когда transaction A
обновляет record1
и пытается обновить record2
, который заблокирован transaction B
- transaction B
обновил record2
и пытаетсяобновите record1
, но record1
заблокирован A
, поэтому оба ждут друг друга.
Общий совет - сохранять транзакции как можно меньше и блокировать строки, которые вы собираетесь обновитькак можно раньше, чтобы предотвратить взаимоблокировку (вы можете использовать select ... для обновления для этого).
Много информации можно найти в документации MySQL и в Руководстве по сертификации MySQL.