Допустим, вы используете уровень изоляции, установленый по умолчанию - REPEATABLE READ
.
При выполнении согласованного чтения (т.е. обычного оператора SELECT
)
InnoDB определяет для транзакции момент времени, по состоянию на который
запросу будет предоставляться информация из базы данных. Таким образом,
если транзакция удаляет строку и фиксирует это изменение после
назначенного момента времени, то вы не увидите, что строка была удалена.
Это справедливо также для вставок и обновлений.
Чтобы такой момент времени ``передвинуть вперед'', нужно зафиксировать
транзакцию, а затем выполнить новую команду SELECT
.
Это называется многовариантным контролем совпадений.
Пользователь A Пользователь B SET AUTOCOMMIT=0; SET AUTOCOMMIT=0; время | SELECT * FROM t; | пустой набор данных | INSERT INTO t VALUES (1, 2); | v SELECT * FROM t; пустой набор данных COMMIT; SELECT * FROM t; пустой набор данных; COMMIT; SELECT * FROM t; --------------------- | 1 | 2 | ---------------------
Таким образом, пользователь A увидит строку, вставленную пользователем B только после того, как B зафиксирует вставку, и A зафиксирует свою собственную транзакцию, чтобы момент времени передвинулся на позицию, находящуюся после фиксации, произведенной пользователем B.
Чтобы увидеть ``самое свежее'' состояние базы данных, необходимо использовать чтение с блокировкой:
SELECT * FROM t LOCK IN SHARE MODE;