MySQL транзакции против блокировки - PullRequest
0 голосов
/ 16 ноября 2011

Быстрый вопрос / уточнение требуется здесь. У меня есть таблица БД, которая вполне может иметь одновременные обновления записи. Я использую Zend Framework для приложения, и я прочитал о двух направлениях, чтобы избежать этого, во-первых, блокировка таблиц (LOCK TABLES test WRITE) или что-то в этом роде, вернусь и перечитаю, как это сделать точно, если это лучшее решение. Вторые транзакции: $ db-> beginTransaction (); ... $ db-> commit ();

Теперь, «предполагая», что я использую механизм хранения транзакций, такой как InnoDB, транзакции кажутся более распространенным решением. Однако это позволяет избежать следующего сценария:

Пользователь A находится на веб-странице -> отправляет данные -> начинает транзакцию -> читает строку -> вычисляет новое значение -> обновляет строку -> сохраняет -> фиксирует

Пользователь B находится на одной и той же веб-странице в одно и то же время и передает данные в одно и то же время, теперь давайте просто скажем, что это почти одновременно (Пользователь B вызывает функцию обновления в точке между началом транзакции и фиксацией для транзакции пользователя А) Пользователь B полагается на зафиксированные данные из транзакции пользователя A, прежде чем он сможет добиться точного расчета для обновления записи.

IE:

Открытие значения в строке базы данных: 5 Пользователь A отправляет значение 5. (начало транзакция -> прочитать значение (5) -> добавить отправленное значение (5 + 5 = 10) -> запись обновленное значение -> сохранить -> зафиксировать)

Пользователь B отправляет значение 7. Мне нужно убедиться, что значение Чтение транзакции пользователя B равно 10, а не 5 (если обновление не выполнено перед прочтением).

Я знаю, что это длинное многословное объяснение, я прошу прощения, я не совсем уверен в правильной терминологии для упрощения вопроса.

Спасибо

1 Ответ

0 голосов
/ 16 ноября 2011

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

Вы должны использовать оба.

Transaction do
 row.lock
 update row
end

Посмотрите, может ли блокировка на уровне строк упростить вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...