Управление транзакциями и блокировками в базах данных, страница 2

Наибольший уровень изоляции транзакций  достигается при значении SERIALIZABLE   (последовательное выполнение или сериализуемость). В этом случае различные транзакции будут полностью  изолированы друг от друга.  И не могут влиять друг на друга.  Пока не будет завершена начавшаяся транзакция, другая должна ожидать её завершения. Но это приводит к заметному снижению производительности системы.  На любом уровне ниже  SERIALIZABLE  появляется риск нарушения целостности базы данных.  Но иногда на этот риск идут во имя повышения производительности. Для этого и используют соответствующие уровни изоляции.

По умолчанию в большинстве СУБД  используется режим READ WRITE и уровень изоляции  SERIALIZABLE .  Если необходимо установить другие параметры транзакции, отличающиеся от значений по умолчанию, то в нужный момент следует применить команду  SET TRANSACTION, например,

SET TRANSACTION

     READ ONLY,

  ISOLATION LEVEL READ  COMMITED  ;

С этого момента следующая транзакция будет иметь уже параметры режим READ ONLY и уровень изоляции  READ  COMMITED.

Субтранзакции

Версия SQL:1999 или SQL3  ввела  многоуровневые транзакции, т.е. транзакции могут состоять из нескольких субтранзакций.   Субтранзакции имеют точки отката, которые устанавливаются с помощью оператора  SAVEPOINT (точка отката или  сохранения). Точка отката создается с помощью оператора вида

SAVEPOINT  имя_точки_отката;

Этот оператор применяется вместе с оператором ROLLBACK:

ROLLBACK TO SAVEPOINT  имя_точки_отката;

Благодаря этому можно отменять не всю транзакцию, а только ту её часть, которая расположена между ROLLBACK и точкой отката.  База данных возвращается в предыдущее состояние.  В этом случае сознательно  нарушается свойство атомарности  всей транзакции.

Журнал транзакций

Для фиксации хода выполнения транзакций, т.е. изменений в БД,  многие СУБД ведут во внешней (дисковой)  памяти специальный журнал в базе данных, называемый журналом транзакций  или  журналом изменений.  Он  содержит сведения обо всех изменениях, выполненных в БД.  Поэтому журнал может использоваться для восстановления БД  после сбоя. Только после записи всех изменений в журнал транзакций, информация переносится из оперативной памяти во внешнюю.

В файл журнала может помещаться следующая информация:

Порядковый номер

Идентификатор транзакции           Тип операции

Указатель назад                               Объект изменений (номер блока, номер строки данных)

Указатель вперед                             Старое значение (исходная копия)

Время начала и завершения           Новое значение (конечная копия)            

 
 


Пример

 Номер

Иденти-

фикатор

Указатель

назад

Указатель

вперед

Время

Операция

Объект

Старое

значение

Новое

значение

1

ОТ1

0

2

9:12

START

2

ОТ1

1

4

9:13

UPDATE

5,  7

(ст. знач.)

(нов. знач.)

3

ОТ2

0

8

9:16

START

4

ОТ1

2

5

9:17

UPDATE

5,  10

(ст. знач.)

(нов. знач.)

5

ОТ1

4

7

9:17

INSERT

11,  2

6

КТ1

0

9

9:18

START

7

ОТ1

5

0

9:19

COMMIT

8

ОТ2

3

0

9:20

COMMIT

9

КТ1

6

10

9:21

UPDATE

8,  5

(ст. знач.)

(нов. знач.)

10

КТ2

9

0

9:21

COMMIT

Журнал должен содержать копию каждой записи перед её изменением (старое значение) и после её изменения (новое значение).  Все действия  каждой  транзакции связаны между собой указателями. Указатель назад указывает на предыдущее изменение, сделанное данной транзакцией. Например, в строке 7 транзакция ОТ1 ссылается на строку 5, которая  является предыдущим действием этой транзакции. Указатель вперед ссылается на следующее изменение, выполненное данной транзакцией (прямой указатель). В строке 4 указатель вперед указывает на строку 5.  Нуль в поле указателя означает конец списка. Транзакция будет завершена.

 Подсистема восстановления использует эти указатели для отыскания всех записей, относящихся к данной транзакции. В случае отката транзакции журнал просматривается (сканируется) в обратном направлении.  Все изменения   отменяемой транзакции просматриваются и  заменяются старыми (прежними) значениями.

Многие СУБД  также периодически выполняют контрольные точки.  Контрольная точка — это момент времени, в который все изменения   в БД до текущей транзакции  гарантированно записаны во внешнюю память.  В журнал изменений  вносится отметка  контрольной точки. После прохождения контрольной точки информация в журнале изменений до этого номера может быть удалена или заархивирована, т.к. она записана в БД.