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;

Я хочу знать, является ли уровень изоляции правильным и есть ли необходимость в выражении "ОБНОВЛЕНИЕ". Я делаю это правильно?

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

Другие вопросы по тегам