Динамический Сервер Informix (IDS). Блокировка, Часть 1: Механизмы блокировки и анализ конфликтов блокировки в работе IDS

Эрик Хербер, Independent Consultant (Herber Consulting)

Оглавление

Введение

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

В то же время блокировка часто приводит к конфликту операций и ситуации ожидания. Это является одной из основных проблем, возникающих перед администратором базы данных в процессе работы. Анализировать подобные проблемы блокировки без использования соответствующих скриптов очень сложно, и велика вероятность ошибки.

В этой статье объясняются механизмы блокировки в IDS и даются советы по анализу конфликтов блокировки и ситуаций ожидания.
Для иллюстрации примеров используется база данных stores_demo, которая создается командой:

  • dbaccessdemo stores_demo -log

Типы блокировки

IDS использует несколько типов блокировки:

Блокировка с обеспечением совместного доступа (Shared lock)

Такой тип блокировки может быть установлен для строк, на которых нет блокировки взаимоисключающего доступа (exclusive lock). Другие пользователи могут установить дополнительную блокировку shared lock либо блокировку применения обновлений (update lock) на ту же строку, но блокировки для обеспечения взаимоисключающего доступа (exclusive lock) не могут быть установлены.

Блокировка обновления (Update lock)

Особый тип блокировки, вызываемый курсором, объявленным с оператором for update. Блокировка обновлений может быть установлена для строки, не блокированной update lock или exclusive lock. Если блокировка update lock уже применена к строке, то как только происходит изменение этой строки, тип блокировки меняется на exclusive lock.

Блокировка для обеспечения взаимоисключающего доступа (Exclusive lock)

Такой тип блокировки может быть установлен для строк, на которых нет блокировки. Если для строки устанавливается блокировка exclusive lock, то для этой строки уже нельзя применить другую блокировку. Строка резервируется исключительно для текущего сеанса работы с базой данных.

Общая блокировка (Intent lock)

Это особый тип блокировки. К примеру, если происходит обновление строки, то для этой строки устанавливается блокировка exclusive lock, а для остальной таблицы устанавливается запрещающая одновременный доступ блокировка intent lock. Этот тип блокировки (intent exclusive lock) не позволяет другим пользователям или программам устанавливать блокировки share lock или exclusive lock, в то время как для строки таблицы установлена блокировка exclusive lock.

Степень дробления блокировок

IDS позволяет разработчикам приложений устанавливать блокировку различных объектов. Эти объекты и рассматриваются ниже.

Блокировка базы данных

Для баз данных может быть установлена блокировка, обеспечивающая режим совместного доступа (shared lock) либо взаимоисключающего доступа (exclusive lock). При блокировке exclusive lock другие пользователи или программы не могут получить доступа к БД. Блокировка share lock позволяет разным пользователям одновременно осуществлять чтение или изменение данных в этой БД, но запрещает установку блокировки exclusive lock для этой БД.

  • Блокировка, обеспечивающая совместный доступ к БД (Database share lock)

    Такой тип блокировки автоматически устанавливается для данной БД при ее открытии. Этот тип блокировки не позволяет другим пользователям или программам устанавливать блокировку exclusive lock для этой БД. Такие утилиты, как onunload также могут устанавливать блокировку типа share lock для БД.

    • Оператор языка структурирующих вопросов SQL
      • database stores_demo

    Листинг 1. Блокировка share lock для базы данных

                                Output from  
    onstat -k:
    ----------------------
    Locks
    address  wtlist   owner    lklist   type     tblsnum  rowid    key#/bsiz
    300583dc 0        400d6998 0         HDR+S   100002  207       0
    

    На этом примере видно, что для БД установлена блокировка share lock (HDR+S) tblsnum=100002 представляет табличную область БД. rowid=207 представляет собой шестнадцатеричный идентификатор строки, описывающей эту БД в таблице sysdatabases внутри БД sysmaster. Таблица sysmaster:sysdatabases представляет собой так называемую табличную область БД.

    Базы данных и их шестнадцатеричные идентификаторы строки можно выбрать с помощью следующего запроса SQL:

    Листинг 2. Запрос базы данных sysmaster о получении шестнадцатеричного идентификатора строки табличной области

                                
    Query:
    ------
    database sysmaster;
    
    select  name,  hex(rowid)  hex_rowid
    from sysdatabases;
    
    Result:
    -------
     name                  hex_rowid
    
    linux_mag            0x00000204
    onpload              0x00000206
     stores_demo       0x00000207 
    sysmaster            0x00000201
    sysuser              0x00000203
    sysutils             0x00000202
    tpcb                 0x00000208

  • Блокировка, обеспечивающая взаимоисключающий доступ к БД (Database Exclusive Lock)

    Такой тип блокировки может быть явно установлен для БД. Такие утилиты, как dbexport, также могут устанавливать блокировку типа exclusive lock для БД, которую требуется экспортировать.

    • Оператор SQL
      • database stores_demo exclusive

    Листинг 3. Блокировка exclusive lock для базы данных

                                
    Output from  onstat -k:
    ----------------------
    Locks
    address  wtlist   owner    lklist   type     tblsnum  rowid    key#/bsiz
    300583dc 0        400d63d8 0        HDR+ X   100002  207       0   
    

    На этом примере видно, что установлена блокировка exclusive lock (HDR+X) для БД с шестнадцатеричным кодом rowid=207.

Блокировка таблиц

Как и базы данных, для таблиц может применяться блокировка, обеспечивающая совместный доступ (share lock), либо обеспечивающая взаимоисключающий доступ (exclusive lock). При установленной блокировке exclusive lock, другие пользователи или программы не могут произвести чтение или изменение данных в данной таблице. Исключением являются сессии, работающие с уровнем локализации dirty read (read uncommitted). Такие сессии могут производить чтение данных (возможно, несогласованных) из таблицы, блокированной exclusive lock. Применение к таблице shared lock позволяет другим пользоваться данными этой таблицы, но не позволяет вносить в нее изменения.

  • Блокировка таблицы, обеспечивающая совместный доступ (share lock)

    Блокировка share lock может устанавливаться для таблиц. Такие утилиты, как onunload и oncheck (в зависимости от того устанавливается блокировка для страницы или строки) также могут устанавливать блокировку share lock для таблицы, в которой они работают.

    • Оператор SQL
      • begin; lock table orders in share mode

    Листинг 4. Блокировка для таблицы share lock

    Output from  onstat -k:
    ----------------------
    Locks
    address  wtlist   owner    lklist   type     tblsnum  rowid    key#/bsiz
    300582e0 0        400d63d8 300583dc HDR+ S   10013b  0         0   
    					

    На примере видно, что установлена блокировка share lock (HDR+S) и ID строки ноль (rowid=0). Нулевой ID строки показывает, что таблица блокирована. Число табличной области (tblsnum=10013b) соответствует шестнадцатеричному номеру этой таблицы.

    Есть два способа определить блокируемую таблицу: команда

    • oncheck,
    • Data Dictionary Query

    Листинг 5. Определение таблицы по ее шестнадцатеричному номеру

                                
    Dictionary Query:
    -----------------
    database stores_demo;
    
    select st.tabname, dbinfo("dbspace", st.partnum), hex(st.partnum)
    from systables st
    where  hex(st.partnum) = "0x0010013B" ;
    
    Result:
    ------
    tabname              dbspace              hex_partnum
    
     orders                rootdbs              0x0010013B
    
    
    oncheck command:
    ----------------
    oncheck -pt  0x0010013b 
    
    Result:
    -------
    
    TBLspace Report for  stores_demo:informix.orders 
    
        Physical Address               1:1988
        Creation date                  08/21/2006 20:07:41
        TBLspace Flags                 801        Page Locking
        TBLspace use 4 bit bit-maps
        Maximum row size               80
        Number of special columns      0
    ...
    ...
    				

    Обратите внимание на то, что необходимо поставить 0x00 перед шестнадцатеричным номером, полученным с помощью команды onstat -k, и что буквы должны быть прописными (10013 -> 0x00 10013 B ), чтобы можно было найти таблицу с помощью запроса.

    Если вы запрашиваете фрагментированную таблицу, словарная таблица sysfragments:

    Листинг 6. Определение таблицы по ее шестнадцатиричному номеру

                                
    Query:
    ------
    database stores_demo;
    
    select st.tabname, dbinfo("dbspace", sf.partn), hex(sf.partn)
    from systables st, sysfragments sf
    where st.tabid = sf.tabid
    and   sf.fragtype = "T"
    and    hex(sf.partn) = "0x0010013B" ;
    
    Result:
    -------
    No rows found.
    				

    Таблица с номером раздела (partition number) 0x0010013B в этом примере не является фрагментированной, поэтому не существует записей в таблице sysfragments, относящихся к ней. Для фрагментированных таблиц существуют записи в sysfragments, и таким образом их можно определить с помощью вышеупомянутых команд запроса.

    Команда oncheck -pt <hex_partnum> не работает для фрагментированных таблиц, так как выводит не название таблицы, а информацию о разделе (partition).

  • Блокировка таблицы, обеспечивающая взаимоисключающий доступ (exclusive lock)

    Блокировка (exclusive lock) может устанавливаться для таблиц явно, либо неявно с помощью таких операторов, как alter table.

    • Оператор SQL
      • begin; lock table orders in exclusive mode

    Листинг 7. Блокировка exclusive lock для таблицы

    Output from  onstat -k:
    ----------------------
    Locks
    address  wtlist   owner    lklist   type     tblsnum  rowid    key#/bsiz
    300582e0 0        400d63d8 300583dc HDR+ X   10013b
        0        0
    

    Здесь встречается exclusive lock (HDR+X) для таблицы с шестнадцатеричным tblsnum=10013b

Блокировка страницы или строки

Степень дробления блокировок (страница либо строка) может быть задана при создании страницы или изменена позже с помощью оператора alter table

  • Новая таблица
    • create table t1 (f1 int) lock mode (row)
  • Существующая таблица
    • alter table t1 modify lock mode (page)

Тип блокировки по умолчанию, который используется, если тип блокировки не был указан при создании таблицы, может быть настроен параметром onconfig DEF_TABLE_LOCKMODE или с помощью переменной IFX_DEF_TABLE_LOCKMODE.. Установка типа блокировки в операторе create table перекрывает значение переменной IFX_DEF_TABLE_LOCKMODE и параметра конфигурации DEF_TABLE_LOCKMODE.

При блокировке страницы IDS всегда блокирует целую страницу БД вместо отдельной строки, даже если изменения происходят в лишь одной строке. В зависимости от размеров строки и страницы такая блокировка может вызвать ограничение в доступе. Важно упомянуть, что блокировка на уровне страницы затрагивает не только страницы данных, но и страницы индексов. Это может повлечь за собой дальнейшее ограничение доступа, т.к. страницы индексов обычно содержат больше записей, чем страницы данных.

Есть два способа определить текущий тип блокировки страницы:

Листинг 8. Определение типа блокировки страницы с помощью oncheck (a) или словарного запроса (query) (b)

                    
a) Command:
-----------
oncheck  -pt  stores_demo:eherber.orders

Output:
-------
TBLspace Report for stores_log:informix.orders

Physical Address               1:3905
Creation date                  05/08/2006 16:47:43
TBLspace Flags                 801         Page  Locking
...
...

b) Query:
---------
database stores_demo;

select tabname,  locklevel  
from systables 
where tabname = "orders";

Result:
-------
tabname              locklevel

orders                P 
				

Для описания уровня блокировки IDS использует следующие аббревиатуры:

  • B -- Просмотр (Проверка уровня блокировки нижележащих страниц)
  • P -- Блокировка страницы
  • R -- Блокировка строки

Генерирование команд alter table для изменения типа блокировки всех таблиц на блокировку строки может быть осуществлено с помощью следующего мета-оператора SQL:

Листинг 9. Использование мета-SQL для изменения типа блокировки всех страниц на блокировку строки

                
Meta SQL:
---------
database stores_demo;

output to alter_table.sql without headings
select "alter table '" // trim(owner) // "'." // trim(tabname) // " lock mode(row);"
from    'informix'.systables
where   tabid > 99
and     tabtype = 'T'
and     locklevel = 'P';

Generated output file 'alter_table.sql':
----------------------------------------
alter table 'informix'.customer lock mode(row);
alter table 'informix'.orders lock mode(row);
...
...
		

  • Блокировка страницы

    Страница БД блокируется во время обработки строки при условии, что для таблицы были выставлен уровень блокировки - страничный. Блокировка может быть взаимоисключающей (exclusive lock) (вставка, изменение или удаление) либо совместной (share lock) (выбор уровня локализации repeatable read).

    • Оператор SQL
      • begin; update orders set ship_charge = (ship_charge*1.2) where order_num = 1005

    Листинг 10. Exclusive lock на странице

    Output from  onstat -k:
    ----------------------
    Locks
    address  wtlist   owner    lklist   type     tblsnum  rowid    key#/bsiz
    440cf9bc 0        4506c3d0 0        HDR+S    100002   207         0
    440cfa14 0        4506c3d0 440cf9bc HDR+IX   10013b   0           0
    440d082c 0        4506c3d0 440cfa14 HDR+X    10013b   100         0
    					

    На этом примере показаны три типа блокировки:

    1. Блокировка share lock (HDR+S) для базы данных. tblsnum=100002 - номер раздела табличной области БД.
      • Блокировка share lock предотвращает взаимоисключающее блокирование (exclusive lock) БД другими транзакциями.
    2. Блокировка intent exclusive (HDR+IX) для базы данных. tblsnum=0 указывает на блокировку таблицы.
      • Блокировка intent exclusive предотвращает взаимоисключающее либо совместное блокирование (exclusive или shared lock) БД.
    3. Блокировка exclusive lock на странице (rowid=100. При блокировании страницы на конце ID-строки выставляются два нуля (00).
      • Блокировка intent exclusive предотвращает взаимоисключающее либо совместное блокирование (exclusive или shared lock) страницы другими транзакциями.

  • Блокировка строки

    Строки блокируются на странице БД во время обработки строки при условии, что выставленный уровень блокировки - строчный. Блокировка может быть взаимоисключающей (exclusive lock) (вставка, изменение или удаление), либо совместной (share lock) (выбор уровня локализации repeatable read).

    • Оператор SQL
      • begin; set isolation to repeatable read; select * from customer where customer_num = 110

    Листинг 11. Блокировка share lock на строке

                                
    Output from  onstat -k:
    ----------------------
    Locks
    address  wtlist   owner    lklist   type     tblsnum  rowid    key#/bsiz
    440cf9bc 0        4506c3d0 0        HDR+S    100002   207         0
    440cfa14 0        4506c3d0 440cf9bc HDR+IS   100139   0           0
    440cfd84 0        4506c3d0 440d082c HDR+S    100139   10a         0
    440d082c 0        4506c3d0 440cfa14 HDR+SR   10013a   10a      K- 1
    					

    В этом примере содержатся 4 типа блокировки:

    1. Блокировка share lock (HDR+S) для базы данных. tblsnum=100002 - номер раздела табличной области БД.
      • Блокировка share lock предотвращает взаимоисключающее блокирование (exclusive lock) БД другими транзакциями.
    2. Блокировка intent share (HDR+IS) для таблицы. tblsnum=0 указывает на блокировку таблицы.
      • Блокировка intent share lock предотвращает взаимоисключающее блокирование (exclusive lock) БД другими транзакциями.
    3. Блокировка share lock для отдельной строки (rowid=10a).
      • Блокировка share lock для строки предотвращает взаимоисключающее блокирование (exclusive lock) строки другими транзакциями.
    4. Блокировка share lock на ключе индекса (K-1).
      • Блокировка share lock для ключа предотвращает взаимоисключающее блокирование (exclusive lock) ключа индекса другими транзакциями.

    Блокированную строку можно определить следующим словарным запросом:

    Листинг 12. Определение блокированной строки

    Query:
    ------
    database stores_demo;
    set isolation to dirty read;
    
    select *
    from  customer
    where hex(rowid) = "0x0000010A";
    
    Result:
    -------
    customer_num  110
    fname         Roy
    ...
    ...
    					

Блокировка ключа индекса

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

Блокировка ключа индекса отображается с помощью K в колонке key#/bsiz, полученной с помощью команды onstat -k.

Типы логгинга (ведения журнала) транзакций

Каждая БД, созданная в IDS может иметь один из четырех возможных уровней логгинга:

  • Нет логгинга
  • Буферизированный логгинг (Buffered logging)
  • Небуферизированный логгинг (Unbuffered logging)
  • Логгинг ANSI

Эти типы логгинга рассматриваются ниже.

Нет логгинга

БД работает без использования логгинга транзакций. Операторы begin, rollback и commit не допускаются. Транзакции не записываются в лог. Каждый оператор SQL - атомарен. Строки блокируются на время исполнения одного оператора SQL.

  • Уровень локализации по умолчанию
    • Dirty read -- единственно возможный тип локализации для таких БД.
  • Оператор SQL
    • create database stores_demo

Буферизированный логгинг

Транзакции записываются в лог. Для группировки нескольких операторов SQL в одну транзакцию необходимо использовать оператор begin Транзакция заканчивается после исполнения оператора commit или rollback. При отсутствии оператора begin, каждый оператор SQL обрабатывается как отдельная транзакция.

При выполнении оператора commit транзакция не записывается в лог на диск. Как и следует из названия данного типа логгинга (буферизированный), транзакция записывается в буфер, находящийся в совместной памяти. Буфер лога записывается на диск, как только происходит его заполнение или как только происходит подтверждение транзакции в БД с небуферизированным логгингом или с логгингом типа ANSI.

Преимуществом этого типа логгинга является высокая производительность, но необходимо иметь в виду возможность потери транзакций при сбое в системе. Рекомендуется использовать для хранения логов RAM-диски с батарейным питанием в случае, если требуется высокая производительность при работе с важными данными.

  • Уровень локализации по умолчанию
  • Текущим уровнем локализации для этого типа БД является committed read, но пользователь или приложение может выбрать другой с помощью оператора set isolation to <isol_level>
  • Оператор SQL
    • create database stores_demo with buffered log

Небуферизированный логгинг

Отличается от буферизированного логгинга только тем, что буфер записывается на диск при исполнении оператора commit. При этом типе логгинга потеря транзакций исключена.

  • Уровень локализации по умолчанию
  • Пользователь или приложение может выбрать другой уровень локализации с помощью оператора set isolation to <isol_level>
  • Оператор SQL statement
    • create database stores_demo with log

Логгинг ANSI

Уровнем локализации по умолчанию для этого типа БД является repeatable read, это означает, что блокировка shared lock применяется для каждой обрабатываемой колонки. Это может вызвать конфликт блокировок и простои. Уровень локализации может быть изменен с помощью оператора set isolation to <isolation_level>

  • Уровень локализации по умолчанию
  • Пользователь или приложение может выбрать другой уровень локализации с помощью оператора set isolation to <isol_level>
  • Оператор SQL
    • create database stores_demo with log mode ansi

Типы логгинга БД и уровни локализации по умолчанию

Тип логгинга БД

Оператор создания

Уровень локализации по умолчанию

Нет логгинга  create database stores_demo Dirty read 
Буферизированный логгинг  create database stores_demo with buffered log Committed read 
Небуферизированный логгинг  create database stores_demo with log Committed read 
Тип логгинга ANSI (unbuffered logging) create database stores_demo with log mode ansi Repeatable read 

Текущий тип логгинга базы данных может быть определен с помощью утилиты onmonitor или запросом sysmaster:

  • onmonitor (статус БД)
    • N -- Нет логгинга
    • B -- Буферизированный логгинг
    • U -- Небуферизированный логгинг
    • U* -- Тип логгинга ANSI (небуферизированный логгинг)
  • запрос sysmaster

    Листинг 13. Определение типа логгинга БД

    Query:
    ------
    database sysmaster;
    
    select name, is_logging, is_buff_log, is_ansi
    from sysmaster:sysdatabases;
    
    Result:
    -------
    name         stores_ansi
    is_logging    1 
    is_buff_log  0
    is_ansi       1 
     
    name         stores_demo
    is_logging    1 
    is_buff_log  0
    is_ansi      0
    				

Тип логгинга БД может быть изменен с помощью утилит ontape или ondblog. Обратите внимание, что IDS не позволяет менять тип логгинга ANSI на какой-либо другой.

Уровни локализации

В зависимости от типа логгинга БД, IDS предоставляет четыре различных уровня локализации. В этом разделе они рассмотрены в подробностях.

Уровни локализации в IDS и в ANSI

Informix SQL

ANSI SQL

Dirty read  Read uncommittted
Committed read  Read committed
Cursor stability  Not available  
Repeatable read  Serializable

Dirty read (ANSI: Read uncommitted)

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

Dirty read - единственно возможный уровень локализации при работе с БД без логгинга.

  • Informix SQL
    • set isolation to dirty read [retain update locks]
  • ANSI SQL
    • set transaction isolation level read uncommitted

Committed read (ANSI: Read committed)

При этом уровне локализации производится чтение только примененных данных.

Сессия, работающая с данным уровнем локализации, проверяет возможность установки блокировки shared lock для строки, но не устанавливает ее. Таким образом, исключается чтение строк, обновляемых в данный момент параллельной транзакцией. Однако прочитанная строка может быть затем изменена параллельной транзакцией, так как при данном уровне локализации блокировка строки не устанавливается.

Committed read - уровень локализации по умолчанию при работе с БД с буферизованным или небуферизованным логгингом, но не с типом логгинга ANSI.

  • Informix SQL
    • set isolation to committed read [retain update locks]
  • ANSI SQL
    • set transaction isolation level read committed

Cursor stability (стабильность курсора) (ANSI: --)

Уровень локализации стабильности курсора относится только к курсорам, объявленным оператором FOR UPDATE.

IDS применяет блокировку update lock для текущей выбранной строки. При изменении строки тип этой блокировки меняется на exclusive lock, которая остается действительной до окончания транзакции, независимо от текущего положения курсора. При выборе следующей строки без изменения предыдущей, блокировка update lock снимается с предыдущей строки и применяется к текущей. Эта последовательность действий может быть изменена, если вы добавите retain update locks к оператору set isolation. В этом случае блокировка update lock не снимается при выборе следующей строки.

Блокировка update lock может быть применена только для строк, не блокированных update lock или exclusive lock. Однако при блокировке update lock другие сессии могут также заблокировать данную строку блокировкой shared lock. В результате, при обновлении этой строки произойдет ошибка, т.к. IDS не сможет поменять тип блокировки update lock на exclusive lock, из-за уже имеющейся блокировки shared lock. Вот желаемое поведение. Если вы желаете быть уверенным в том, что сможете позже изменить данную строку, вам необходимо заранее обновить данную колонку (можно не вносить изменений). При этом тип блокировки изменится на exclusive lock. Параллельные сессии не смогут применить блокировку shared lock для данной строки.

  • Informix SQL
    • set isolation to cursor stability [retain update locks]
  • ANSI SQL
    • --

Повторы чтения (упорядочиваемые при помощи ANSI)

Уровень локализации repeatable read устанавливает блокировку shared lock для каждой обработанной строки (или страницы, если для таблицы активна блокировка на уровне страницы. Это не позволяет другим пользователям изменять колонки.

Оператор retain update locks не применим на этом уровне локализации, так как при repeatable read автоматически сохраняются блокировки share lock или update lock.

Repeatable read - уровень локализации, используемый по умолчанию для БД с типом логгинга ANSI

  • Informix SQL
    • set isolation to repeatable read
  • ANSI SQL
    • set transaction isolation level to serializable

Различия между Informix SQL и ANSI SQL

Есть два больших различия между оператором Informix SQL set isolation to <isol_level> и оператором ANSI SQL set transaction isolation level <isol_level>.

В Informix этот оператор задает уровень локализации, который будет действовать в течении всей сессии, до тех пор пока не будет использован еще один оператор set isolation to <isol_level>.

В варианте ANSI уровень локализации, задаваемый данным оператором, действует только в течении данной транзакции. После завершения транзакции уровень локализации меняется на действующий по умолчанию для данного типа БД. см. раздел Типы логгинга БД

Также при использовании ANSI SQL невозможно поменять уровень локализации внутри одной транзакции с помощью оператора set transaction isolation level <isol_level>. Это не допускается, в отличие от Informix, где это разрешено.

set session isolation level

Текущий уровень локализации сессии БД можно определить с помощью команды onstat -g sql:

Листинг 14. Список уровней локализации для индивидуальных сессий БД

                    
Command:
---------
onstat -g sql

Output:
-------
Sess  SQL            Current            Iso Lock       SQL  ISAM F.E.
Id    Stmt type      Database           Lvl Mode       ERR  ERR  Vers Explain
50    -              stores_demo        RR  Wait 10    0    0    9.03 Off
45    -              stores_demo        DR  Not Wait   0    0    9.03 Off
...
...
		

Текущий уровень локализации показан ниже Iso Lvl с использованием следующих сокращений:
  • DR -- Dirty read
  • CR -- Committed read
  • CS -- Cursor stability
  • RR -- Repeatable read

Естественным было бы введение возможности задавать тип локализации по умолчанию на уровне БД. Сервер Informix XPS уже позволяет это проделать с помощью процедуры sysdbopen(). Было бы желательно портировать эту возможность на IDS.

Заключение

В этой статье мы рассмотрели типы блокировки, степень дробления блокировок, типы логгинга БД и уровни локализации. В следующей статье мы поговорим на следующие темы:

  • Длительность блокировки
  • Динамическое распределение блокировок
  • Взаимоблокировка
  • Простои при блокировках

Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=2807