Повторяемое чтение Mysql (1) — при создании моментального снимка

MySQL
Повторяемое чтение Mysql (1) — при создании моментального снимка

оригинал:zhuanlan.zhihu.com/p/55819387
Автор: Уиллоу

Раньше понимание повторяемого чтения заключалось в том, что отправка других транзакций не влияла на результаты запроса текущей транзакции;

Позже, зная, что в начале транзакции будет сгенерирован снимок;

Однако такое понимание повторяемого чтения все еще поверхностно.

На мой взгляд, чтобы по-настоящему понять повторяемое чтение, по крайней мере, следующие термины должны быть связаны вместе и ясно объяснены:

Начиная с этой лекции, я постараюсь на различных примерах связать воедино эти знания, чтобы всем было понятно, что именноRepeatable Read.

Начнем с простого,Когда мы говорим о «моментальных снимках»?

Некоторые студенты сказали, что снимок был создан, когда он начался.

Да?

Давайте построим минималистскую таблицу:

CREATE TABLE `t` (
  `id` int(11) NOT NULL,
  `c` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

Вставьте две части данных:

insert into t values(1,1),(2,2);

Затем выполните следующие операторы sql в двух окнах сеанса в порядке, указанном в следующей таблице:

Вы можете открыть два окна командной строки, как это сделал я, и выполнить:

Если Mysql действительно создает моментальный снимок при запуске, то когда сеанс A выполняет оператор select, запрос c должен быть равен 1, но фактический запрос равен 3, что указывает на то, что моментальный снимок не создается сразу после начала генерации.

Поэтому мы пытаемся поместить оператор select перед оператором обновления сеанса B:

На этот раз вы обнаружите, что когда сеанс A выполняет оператор select на второй день, запрос c по-прежнему равен 1, что указывает на то, что моментальный снимок был сгенерирован при выполнении первого оператора select, а обновление сеанса B не имеет никакого эффекта. на сессии А.

Так можно ли сказать, что моментальный снимок будет сгенерирован при выполнении операторов SQL, управляющих базой данных MySQL?

нет,Только оператор sql «чтение моментального снимка» создаст моментальный снимок,НапримерРазблокированный оператор выбора;

Оператор SQL «текущее чтение» не будет генерировать моментальный снимок, например, обновить, выбрать ... для обновления, выбрать .. заблокировать в режиме общего доступа и т. д.;

Таким образом, в следующем примере сеанс A увидит данные, измененные сеансом B, когда он их выберет, потому что во время обновления не создается моментальный снимок:

Тогда вы говорите, я просто хочу создать моментальный снимок, когда я начну?

Отправить вам sql:

start transaction with consistent snapshot; 

Обобщить:

  • Ключ к воспроизводимым чтениям исходит из «моментальных снимков».
  • «Снимок» создается не после начала, а после первого оператора «прочитать снимок».

Итак, снова возникает вопрос, что же такое «снимок»? Это полная копия текущих данных? Нужно ли копировать данные текущей базы данных каждый раз при открытии транзакции?

В следующей лекции поговорим о принципе реализации повторяемого чтения — MVCC.

Ссылаться на