Задать вопрос

Для чего WITH CONSISTENT SNAPSHOT?

Увидел, что можно делать транзакцию REPEATABLE READ с START TRANSACTION WITH CONSISTENT SNAPSHOT. Я так понимаю, что он делает дополнительный bin log для снэпшотов и заменяет собой FLUSH TABLES WITH READ LOCK. Грубо говоря, если мы хотим сделать бэкап вместе с замороженными незавершенными транзакциями, например, через SELECT ... INTO OUTFILE, то я могу вообще не делать полную блокировку таблиц, чтобы не потерять незавершенные транзакции. Я правильно понимаю смысл использования? Тогда имеет ли смысл добавлять вообще ко всем REPEATABLE READ транзакциям WITH CONSISTENT SNAPSHOT?
  • Вопрос задан
  • 172 просмотра
Подписаться 3 Средний Комментировать
Решения вопроса 1
@galaxy
Я бы не назвал себя специалистом в mysql, но вот что можно увидеть из документации, как минимум:
The WITH CONSISTENT SNAPSHOT modifier starts a consistent read for storage engines that are capable of it. This applies only to InnoDB. The effect is the same as issuing a START TRANSACTION followed by a SELECT from any InnoDB table. See Section 15.7.2.3, “Consistent Nonlocking Reads”. The WITH CONSISTENT SNAPSHOT modifier does not change the current transaction isolation level, so it provides a consistent snapshot only if the current isolation level is one that permits a consistent read. The only isolation level that permits a consistent read is REPEATABLE READ. For all other isolation levels, the WITH CONSISTENT SNAPSHOT clause is ignored. A warning is generated when the WITH CONSISTENT SNAPSHOT clause is ignored.


То бишь:
1. Все это касается только InnoDB
2. START TRANSACTION WITH CONSISTENT SNAPSHOT не отличается от START TRANSACTION + SELECT (точнее, как я понял, тот самый консистентный снепшот фиксируется в первом случае в момент START TRANSACTION, а во втором - в момент SELECT).
3. Суть одна и та же - транзакция видит данные на момент фиксации снепшота, независимо от того, что там делают параллельные транзакции (+ она, конечно, видит свои собственные изменения)
4. WITH CONSISTENT SNAPSHOT не меняет уровень изоляции
5. WITH CONSISTENT SNAPSHOT работает только с REPEATABLE READ и игнорируется для любых других уровней с выдачей предупреждения (блин, не имею возможности проверить: что, даже для SEIRALIZABLE?)

Короче, вывод: ставите REPEATABLE READ (он, впрочем, стоит по умолчанию) и нафиг не сдался этот WITH CONSISTENT SNAPSHOT.

я могу вообще не делать полную блокировку таблиц, чтобы не потерять незавершенные транзакции. Я правильно понимаю смысл использования?

Смысл: вы получаете снимок состояния БД на момент фиксации снепшота. Обычно, это то, что нужно для бекапа
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы