7.5. Таблицы InnoDB
7.5.8. Транзакционная модель InnoDB
7.5.8.6. Пример работы согласованного чтения в InnoDB
Допустим, вы используете уровень изоляции, установленый по умолчанию - 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;
4УM4УM4УM4УM4
| 1 | 2 |
4УM4УM4УM4УM4
Таким образом, пользователь A увидит строку, вставленную пользователем B только после того, как B зафиксирует вставку, и A зафиксирует свою собственную транзакцию, чтобы момент времени передвинулся на позицию, находящуюся после фиксации, произведенной пользователем B.
Чтобы увидеть "самое свежее" состояние базы данных, необходимо использовать чтение с блокировкой:
SELECT * FROM t LOCK IN SHARE MODE;
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|