MySql InnoDB увеличивает и возвращает поле в транзакции

В моем приложении я хочу взять значение из таблицы InnoDB, а затем увеличить и вернуть его в рамках одной транзакции. Я также хочу заблокировать строку, которую я собираюсь обновить, чтобы предотвратить изменение значения другим сеансом во время транзакции. Я написал этот запрос;

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN TRANSACTION;
SELECT @no:=`value` FROM `counter` where name='booking' FOR UPDATE;
UPDATE `counter` SET `value` = `value` + 1 where `name`='booking';
SELECT @no;
COMMIT;

Я хочу знать, правильный ли уровень изоляции и есть ли необходимость в инструкции FOR UPDATE. Я делаю это правильно?


person QuickOrBeDead    schedule 11.04.2015    source источник


Ответы (1)


Да все, что вы делаете, прекрасно.

Ниже строки, которые я прямо цитирую из документации MySQL.

«Если вы запрашиваете данные, а затем вставляете или обновляете связанные данные в той же транзакции, обычная инструкция SELECT не обеспечивает достаточной защиты… Чтобы реализовать чтение и увеличение счетчика, сначала выполните блокирующее чтение счетчика, используя FOR UPDATE, и затем увеличьте счетчик. Например:

SELECT counter_field FROM child_codes FOR UPDATE;
UPDATE child_codes SET counter_field = counter_field + 1;

SELECT ... FOR UPDATE считывает последние доступные данные, устанавливая эксклюзивные блокировки для каждой читаемой строки. Таким образом, он устанавливает те же блокировки, которые искомое SQL UPDATE установило бы для строк.

Ссылка:

https://dev.mysql.com/doc/refman/5.6/en/innodb-locking-reads.html

person Thiru    schedule 24.04.2015