Книга: Мир InterBase. Архитектура, администрирование и разработка приложений баз данных в InterBase/FireBird/Yaffil
Объяснение
Объяснение
Сортировка блокировок достаточно проста, необходимо только узнать немного больше о блокировках. Когда соединение (клиент) запрашивает блокировку на объект, оно указывает в запросе определенный уровень блокировки. Типы блокировок приведены в следующей таблице:
Идентификатор типа блокировки |
Английское наименование |
Русский перевод наименования блокировки |
#define LCK_none 0 |
Отсутствие блокировок |
|
#define LCK_null 1 |
Existence |
Блокировка существования объекта |
#define LCK_SR 2 |
Shared Read |
Совместное чтение |
#define LCK_PR 3 |
Protected Read |
Защищенное Чтение |
#defme LCK_SW 4 |
Shared Write |
Совместная запись |
#define LCK_PW 5 |
Protected Write |
Защищенная запись |
#define LCK_EX 6 |
Exclusive |
Эксклюзивная блокировка |
Блокировка типа LCK_none на самом деле представляет собой запрос на снятие существующей блокировки. Блокировка LCK_null - это блокировка существования, которая налагается клиентским соединением. Для этого соединения важно лишь, чтобы заблокированный объект существовал.
Этот тип блокировки используется для того, чтобы гарантировать существование индексов, пока существуют скомпилированные запросы, которые зависят от этих индексов. Взаимодействие уровней блокировки описывается в следующей таблице совместимости блокировок (здесь 1 означает, что данные блокировки совместимы, 0 - несовместимы):
none |
null |
Shared Read |
Protected Read |
Shared Write |
Protected Write |
Exclusive |
|
попе |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
null |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
SR |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
PR |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
SW |
1 |
1 |
1 |
0 |
1 |
0 |
0 |
PW |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
EX |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
Когда соединение желает заблокировать объект, оно подает запрос на блокировку, который определяет блокируемый объект и желаемый уровень блокировки.
Обычно если объект, который какое-то соединение желает заблокировать, уже блокирован другим соединением, то выстраивается очередь доступа, причем соединения, которые желают получить уровень блокировок ниже, чем тот, что уже наложен на объект, продвигаются вперед очереди. То есть если объект был заблокирован с уровнем Protected Read, то следующие соединения, которые запрашивают на этот объект блокировку Protected Read или ниже, передвинутся в начало очереди (точнее, пройдут без очереди), а соединения, которые запрашивают блокировки уровнем выше (например, Shared Write), будут "топтаться" в очереди. Если загрузка базы данных очень велика, такое поведение может привести к тому, что соединения, которые требуют высоких уровней блокировок, могут ждать неопределенно долго, потому что новые читающие соединения (которые запрашивают низкие уровни блокировки) будут постоянно прибывать и "лезть без очереди".