Классика баз данных - статьи



         

Дополнительные структуры данных


Первой такой структурой является таблица транзакций (transaction table). Эта таблица содержит информацию обо всех незавершенных транзакциях, которые существуют в данный момент в системе. Таблица транзакций также используется при установке контрольных точек и восстановлении. Элемент таблицы содержит поля TransID (идентификатор транзакции) и LastLSN - LSN последней записи, помещенной в журнал этой транзакцией.

Кроме того, элемент таблицы транзакций содержит поля State и UndoNxtLSN. В первом поле хранится статус транзакции - prepared или unprepared. Рассматривается общий случай, когда данная транзакция может являться участницей некоей распределенной транзакции. Тогда то, что транзакция находится в состоянии prepared, означает, что она готова зафиксировать все требуемые изменения и ждет подтверждения от инициатора распределенной транзакции (составной частью которой она являлась), чтобы завершить работу. В тоже время такая транзакция должна сохранять ряд блокировок, чтобы быть в состоянии быстро откатиться в случае неудачного завершения распределенной транзакции. Статус unprepared характеризует то состояние, когда транзакция находится в процессе работы и еще не готова к завершению.

Как можно использовать такую информацию? Дело в том, что в случае сбоя транзакцию, находившуюся в этот момент в состоянии unprepared, скорее всего во время восстановления придется откатить. Но если транзакция находилась в момент сбоя в состоянии prepared, то может оказаться так, что она должна быть восстановлена и завершена. Это происходит в том случае, если инициатор транзакции все еще ждет от нашей БД завершения ее части распределенной транзакции.

Теперь вернемся к полю UndoNxtLSN. В этом поле элемента таблицы транзакций содержится LSN следующей записи журнала, которую необходимо обработать при откате. В случае, когда последняя запись не является CLR-записью, это значение совпадает с LastLSN. Если же последняя журнальная запись транзакции компенсационная, то это значение будет браться из одноименного поля CLR-записи.




Содержание  Назад  Вперед