Для чего 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?
  • Вопрос задан
  • 168 просмотров
Решения вопроса 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.

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

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

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

Войти через центр авторизации
Похожие вопросы