Из MySQL руководство о InnoDB Multi-Versioning:
Внутренне InnoDB добавляет три поля к каждой строке, хранящейся в базе данных.6-байтовое поле DB_TRX_ID указывает идентификатор транзакции для последней транзакции, которая вставила или обновила строку.Кроме того, удаление внутренне обрабатывается как обновление, в котором установлен специальный бит в строке, чтобы пометить его как удаленный.Каждая строка также содержит 7-байтовое поле DB_ROLL_PTR, называемое указателем поворота.Указатель прокрутки указывает на запись журнала отмены, записанную в сегмент отката.Если строка была обновлена, запись журнала отмены содержит информацию, необходимую для перестроения содержимого строки до ее обновления.6-байтовое поле DB_ROW_ID содержит идентификатор строки, который монотонно увеличивается при вставке новых строк.Если InnoDB генерирует кластеризованный индекс автоматически, индекс содержит значения идентификатора строки.В противном случае столбец DB_ROW_ID не появится ни в одном индексе.
Однако я не смог найти никакой информации о том, как именно эти скрытые столбцы (DB_TRX_ID
, DB_ROLL_PTR
и DB_ROW_ID
)используется для создания предыдущего снимка, каков алгоритм?
Другая страница в руководстве о транзакции, доступной только для чтения, гласит следующее:
InnoDB может избежать издержек, связанных с настройкой идентификатора транзакции (поле TRX_ID) для транзакций, которые известны только для чтения.Идентификатор транзакции необходим только для транзакции, которая может выполнять операции записи или блокировать чтение, например SELECT ... FOR UPDATE.Исключение ненужных идентификаторов транзакций уменьшает размер внутренних структур данных, к которым обращаются каждый раз, когда запрос или оператор изменения данных создает представление для чтения.
Принимая во внимание вышеприведенный оператор, транзакции только для чтения неt связали TRX_ID
, тогда должно быть что-то еще, связанное с текущей транзакцией, которое сравнивается со значением DB_TRX_ID
существующих строк, чтобы можно было определить, должна ли эта конкретная строка быть включена во встроенный снимок или нет.
Пожалуйста, опишите алгоритм высокого уровня, а также случай транзакций только для чтения, если он делает процесс другим.