http://dev.mysql.com/doc/refman/5.6/en/set-transaction.html#isolevel_repeatable-read
«Все непротиворечивые чтения в пределах одной транзакции читают снимок
установлено первым чтением. «
На самом деле я думал только о снимке строк, прочитанных при первом чтении, но меня это смущает:
СДЕЛКА 1 запускается сначала, затем 2. Результат последнего «SELECT * FROM B;» в T1 точно так же, как если бы я не выполнял T2 в то же время (НИКАКОЕ ОБНОВЛЕНИЕ, ни ВСТАВКА не появляются и что, хотя чтение и запись находятся в РАЗНЫХ таблицах)
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
START TRANSACTION;
SELECT * FROM A WHERE a_id = 1;
SELECT SLEEP(8);
SELECT * FROM B;
COMMIT;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
START TRANSACTION;
UPDATE B SET b_name = 'UPDATE_6' WHERE b_id = 2;
INSERT INTO B (b_name) VALUES('NEW_5');
COMMIT;
# 1st query
a_id a_name
1 a_1
# 3rd query
b_id b_name
1 b_1
2 b_2
3 b_3
в одной повторяемой транзакции:
Если данные в T1 и T2 каким-либо образом связаны друг с другом, может случиться так, что читатель на 1-м шаге считывает некоторые данные, а на 3-м шаге связанные данные, которые теперь могут быть не связаны, потому что писатель изменил T1 И Т2 тем временем. AFAIK repeatable-read only гарантирует, что одни и те же чтения возвращают те же данные, но 2-е чтение не совпадает с 1-м.
Я надеюсь, вы знаете, что я имею в виду, и я боюсь, что я получил что-то. совершенно не прав насчет этой темы.
(неделю назад я задал этот вопрос на форуме MySQL без ответов: http://forums.mysql.com/read.php?20,629710,629710#msg-629710)
Снимок для всех таблиц в базе данных. Документация MySQL заявляет, что здесь явно несколько раз http://dev.mysql.com/doc/refman/5.6/en/innodb-consistent-read.html:
Последовательное чтение означает, что InnoDB использует мульти-контроль версий для представления
на запрос снимок база данных в определенный момент времени.
а также
Предположим, что вы работаете в изоляции по умолчанию REPEATABLE READ
уровень. Когда вы выдаете согласованное чтение (то есть обычный SELECT
InnoDB дает вашей транзакции момент времени в соответствии с
который ваш запрос видит база данных.
а также
Снимок база данных состояние применяется к операторам SELECT внутри
транзакция, не обязательно для операторов DML.
Других решений пока нет …