Серия сотен вопросов MySQL: функция журнала отмены

MySQL

вопрос

  1. Для чего используется журнал отмены?
  2. цепочка версий журнала отмены
  3. Журнал отмен хранится там и когда он будет выпущен?

Откат и поддержка MVCC

Мы знаем, что innodb поддерживает транзакции. Затем одна из функций транзакции должна поддерживать откат.
Транзакция может быть предназначена для добавления, удаления, модификации и других операций. Так что насчет отката как и реализации?

  • Если в транзакцию добавляется новая запись, то мы записываем новый первичный ключ и удаляем его при откате.
  • Если в транзакции удаляется запись, то мы фиксируем всю информацию записи и вставляем ее как есть при откате.
  • Если в транзакции изменена запись, то нам нужно записать исходную информацию, а затем просто откатиться и обновить исходную информацию.

Журнал отмены предназначен для записи информации для отката.
Так почему же MVCC также полагается на журнал отмен для достижения этой цели?
Возможно, вы слышали, что кластеризованный индекс имеет скрытое поле для каждой записи, которое называетсяrow_id, его роль заключается в том, что если первичный ключ не указан, он становится самоувеличивающимся первичным ключом в системе. При этом каждая запись имеет два поля, одноtrx_id,одинroll_pointerЭти два поля используются для реализации функции MVCC.

  • trx_id: изменить идентификатор транзакции текущей записи.
  • roll_pointer: Только для одного журнала отмены.

Конечно, каждая запись журнала отмены также имеет поля trx_id и roll_pointer.

Готов к работе:

CREATE TABLE `student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `age` int(11) NOT NULL,
  `addresss` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  KEY `index_age` (`age`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;

INSERT student VALUES (1,'张一',1,'ssss'),(2,'张二',2,'ssss');

Содержимое кластеризованного индекса примерно такое:

id name age address trx_id roll_pointer
1 Чжан И 1 ssss 10 адрес insert_undo_log
2 Чжан Эр 2 ssss 10 адрес insert_undo_log

Журнал отмены выглядит так:

id name age address trx_id roll_pointer undo id
1 Чжан И 1 ssss 10 нулевой 0
2 Чжан Эр 2 ssss 10 нулевой 1

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

update set age=10 where id = 1; #更新语句一
update set age=20 where id = 1; #更新语句二
id name age address trx_id roll_pointer undo id
1 Чжан И 1 ssss 20 Укажите на предыдущий адрес журнала вставки 0
1 Чжан И 10 ssss 21 Предыдущий адрес журнала отмены 0

Несколько заметок:

  • Журнал вставки будет переработан и выпущен после завершения последней транзакции вставки.
  • Первый оператор обновления, roll_pointer сохранит последний вставленный журнал вставки. Также сохраните информацию перед обновлением.
  • Поскольку это режим автоматической фиксации транзакции, два обновления будут генерировать два разных trx_id.
  • Записано реальным журналом обновлений信息结构要复杂的多, будут разделены更新主键,和不更新主键Случай. Здесь не подробно.
  • Такая структура цепочки, сформированная журналом отмен в соответствии с roll_pointer, является цепочкой версий.

Где хранится журнал отмены?

После MYSQL 5.6 для журнала отмен можно выделить отдельное табличное пространство.
Количество табличных пространств по умолчанию равно 2, вы можете установить innodb_undo_tablespaces, чтобы увеличить это число.
Каждое табличное пространство разделено на несколько сегментов отката, и количество сегментов отката можно просмотреть в innodb_undo_logs.
В каждом сегменте отката хранятся страницы журнала отмены.
Если транзакции, соответствующие журналу отмен, были выполнены или откат завершился. Затем можно освободить соответствующее пространство журнала отмены.
Предположим, что есть длинная транзакция, которая не была зафиксирована или откатана, тогда журнал отмен будет становиться все больше и больше. Серьезно, это напрямую приведет к заполнению дискового пространства сервера. Поэтому, если использование дискового пространства сервера внезапно резко возрастет, вы также можете проверить, нет ли длинных транзакций, которые не были зафиксированы, из-за чего журнал отмен занимает много места на диске.

Суммировать

журнал отмены имеет две функции:

  • 保障事务的原子性. Все операторы обновления в транзакции либо выполняются, либо откатываются. Все операторы обновления одной и той же транзакции можно отменить, записав журнал отмены с тем же trx_id.
  • Предоставляет цепочку версий, поддерживает MVCC. Цепочка журналов отмены обеспечивает базовую материальную основу для реализации MVCC. Чтобы реализовать MVCC, также необходимо использовать Read View. Подробное объяснение MVCC будет подробно рассмотрено позже.