Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Не соображу, как он добивается того, что все таблицы считываются на момент выполнения оператора BEGIN.
Неактивен
REPEATABLE READ, разумеется.
$ strings /usr/bin/mysqldump | grep ISOLATION SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
Неактивен
If you are running with the default REPEATABLE READ isolation level, all consistent reads within the same transaction read the snapshot established by the first such read in that transaction. You can get a fresher snapshot for your queries by committing the current transaction and after that issuing new queries.
Вот пример:
client1> create table a (a int) engine=InnoDb; Query OK, 0 rows affected (0.02 sec) client1> create table b like a; Query OK, 0 rows affected (0.24 sec) client2> begin; Query OK, 0 rows affected (0.00 sec) client1> insert into a values (1); Query OK, 1 row affected (0.19 sec) client2> select * from a; +------+ | a | +------+ | 1 | +------+ 1 row in set (0.00 sec) client1> insert into b values (1); Query OK, 1 row affected (0.06 sec) client2> select * from b; Empty set (0.00 sec)
Неактивен
То, что в рамках одной таблицы REPEATABLE READ - это понятно.
Имеется в виду, что будет в случае, если mysqldump читал одну таблицу, а в это время другую таблицу (которую дамп не трогал) изменили.
Не получится ли, что в дамп попадут разные версии этих таблиц?
Неактивен
Ты не внимателен. Я как раз на этот вопрос и ответил Смотри пример еще раз
Неактивен
Да, действительно я невнимателен .
То есть, он делает snapshot со всех таблиц? (и во всех БД?)
Неактивен
LazY написал:
Да, действительно я невнимателен .
То есть, он делает snapshot со всех таблиц? (и во всех БД?)
Конечно не делает - это означало бы, что надо залочить все таблицы на время изготовления снапшота. --single-transaction как раз делается для того, чтобы не было блокировок. Здесь используется свойство мультиверсионности Innodb.
Версия фиксируется для всех таблиц Innodb (во всех БД).
Неактивен
Под snapshot я не имел в виду LOCK
Версия фиксируется для всех таблиц Innodb (во всех БД).
Вот. Это и есть ответ на мой вопрос, спасибо
Неактивен
Тема уже очень старая, забрел через поиск, но не могу понять один момент. Прошу объяснить...
paulus, в вашем примере второй клиент начинает транзакцию, после этого первый клиент добавляет данные в 2 таблицы.
Почему внутри транзакции второго пользователя данные из первой таблицы видны, а данные второй таблицы - нет ?
Неактивен
Последовательность немного не такая, как Вы описали. Транзакция начинается не в момент,
когда Вы сказали «BEGIN», а в момент первого обращения к InnoDB (в случае с примером — SELECT).
Ровно поэтому первая выборка видна (транзакция началась после первого INSERT), а вторая — нет
Для простоты можно считать, что единственное, что делает BEGIN — временно отключает autocommit
Неактивен
Спасибо за разъяснение
Неактивен
Страниц: 1