необходимость и область изоляции транзакций — MySQL

http://dev.mysql.com/doc/refman/5.6/en/set-transaction.html#isolevel_repeatable-read

«Все непротиворечивые чтения в пределах одной транзакции читают снимок
установлено первым чтением. «

  1. Что содержит этот снимок? Только снимок строк, прочитанных при первом чтении, полной таблицы или даже полной базы данных?

На самом деле я думал только о снимке строк, прочитанных при первом чтении, но меня это смущает:

СДЕЛКА 1 запускается сначала, затем 2. Результат последнего «SELECT * FROM B;» в T1 точно так же, как если бы я не выполнял T2 в то же время (НИКАКОЕ ОБНОВЛЕНИЕ, ни ВСТАВКА не появляются и что, хотя чтение и запись находятся в РАЗНЫХ таблицах)

СДЕЛКА 1:

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

START TRANSACTION;

SELECT * FROM A WHERE a_id = 1;
SELECT SLEEP(8);
SELECT * FROM B;

COMMIT;

СДЕЛКА 2

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;

РЕЗУЛЬТАТЫ СДЕЛКИ 1

# 1st query
a_id  a_name
1     a_1

# 3rd query
b_id b_name
1    b_1
2    b_2
3    b_3

  1. В моем веб-приложении PHP-скрипт импортирует данные из файлов в базе данных MySQL (InnoDB). Приложение проверяет, что одновременно выполняется только один процесс записи. Однако может быть дополнительно несколько одновременных читателей.
    Теперь мне интересно, должен ли я и если да, как я могу предотвратить следующее:

в одной повторяемой транзакции:

  • считыватель R1 читает из таблицы T1
  • читатель R1 еще
  • считыватель R1 читает из таблицы T2

Если данные в T1 и T2 каким-либо образом связаны друг с другом, может случиться так, что читатель на 1-м шаге считывает некоторые данные, а на 3-м шаге связанные данные, которые теперь могут быть не связаны, потому что писатель изменил T1 И Т2 тем временем. AFAIK repeatable-read only гарантирует, что одни и те же чтения возвращают те же данные, но 2-е чтение не совпадает с 1-м.

Я надеюсь, вы знаете, что я имею в виду, и я боюсь, что я получил что-то. совершенно не прав насчет этой темы.

(неделю назад я задал этот вопрос на форуме MySQL без ответов: http://forums.mysql.com/read.php?20,629710,629710#msg-629710)

0

Решение

Снимок для всех таблиц в базе данных. Документация MySQL заявляет, что здесь явно несколько раз http://dev.mysql.com/doc/refman/5.6/en/innodb-consistent-read.html:

Последовательное чтение означает, что InnoDB использует мульти-контроль версий для представления
на запрос снимок база данных в определенный момент времени.

а также

Предположим, что вы работаете в изоляции по умолчанию REPEATABLE READ
уровень. Когда вы выдаете согласованное чтение (то есть обычный SELECT
InnoDB дает вашей транзакции момент времени в соответствии с
который ваш запрос видит база данных.

а также

Снимок база данных состояние применяется к операторам SELECT внутри
транзакция, не обязательно для операторов DML.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]