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