- •Acid-свойства транзакций
- •Проблемы параллельной работы транзакций
- •Потерянное обновление
- •«Грязное» чтение
- •Неповторяющееся чтение
- •Собственно несовместимый анализ
- •Конфликты между транзакциями
- •Реализация изолированности транзакций средствами sql Уровни изоляции
- •Поведение при различных уровнях изолированности
- •Режимы транзакций сервера ib
- •Уровень изоляции snapshot
- •Уровень изоляции snapshot table stability
- •Уровень изоляции read committed record_version
- •Уровень изоляции read committed no record_version
- •Взаимодействие транзакций
- •Режимы блокировки (ожидания) wait и no wait
- •Использование компонентов ib Express Компонент tibTransaction
- •Явные транзакции в ibx
- •Использование таймера и действия по умолчанию
- •Использование CachedUpdates
- •Работа с транзакциями в примере MastApp, поставляемом с Delphi 5.0
Уровень изоляции snapshot
Соответствует уровню REPEATABLE READ ANSI/ISO, за исключением того, что SNAPSHOT не обеспечивает видимость фантомов, т.е. действительно обеспечивает "воспроизводимое чтение" (в отличие от стандартного уровня изолированности). Транзакция в момент старта получает "снимок" БД, который является неизменным до конца транзакции. Чтение данных, измененных конкурирующей транзакцией, разрешено, однако внесенные ей изменения не доступны. Попытка изменения данных, обновляемых другой транзакцией, приводит к конфликту (Deadlock, SQLCODE = -913). После завершения конкурирующих транзакций обновленные ими данные все равно изменять нельзя, поскольку полученный "снимок" уже не отражает текущего состояния БД (Deadlock. Update conflicts with concurrent update. SQLCODE = -913).
Уровень SNAPSHOT обеспечивает наивысший уровень изоляции, однако может препятствовать внесению изменений в БД при большом числе конкурирующих транзакций. Необходимо применять для обеспечения идентичности результатов одинаковых запросов к БД в рамках одной транзакции.
Установлен в IB по умолчанию.
Уровень изоляции snapshot table stability
Фактически, блокировка всей таблицы на запись. Другие транзакции могут только читать.
Это уровень изоляции также создает "моментальный" снимок базы данных, но одновременно блокирует на запись данные, задействованные в операциях, выполняемые данной транзакцией. Это означает, что если транзакция SNAPSHOT TABLE STABILITY изменила данные в какой-нибудь таблице, то после этого данные в этой таблице уже не могут быть изменены в других параллельных транзакциях. Кроме того, транзакции с уровнем изоляции SNAPSHOT TABLE STABILITY не могут получить доступ к таблице, если данные в них уже изменяются в контексте других транзакций.
Уровень изоляции read committed record_version
Почти полностью соответствует уровню READ COMMITTED ANSI/ISO. Транзакции доступны изменения, произведенные другими завершенными транзакциями. Попытка изменения данных, изменяемых другой незавершенной транзакцией, приводит к конфликту (Deadlock, SQLCODE = -913). В отличие от уровня READ COMMITTED ANSI/ISO разрешается, не завершая транзакции, обновлять данные, измененные и подтвержденные другой транзакцией.
В этом режиме возможно появление фантомных строк и несогласованных данных. Можно применять для запросов к БД, выполняющихся один раз в течение транзакции и не накапливающих суммирующих результатов.
Уровень изоляции read committed no record_version
Аналогичен режиму READ COMMITTED RECORD_VERSION, однако попытка даже простого чтения данных, изменяемых другой транзакцией, приводит к конфликту (Deadlock, SQLCODE = -913). После завершения конкурирующих транзакций можно читать и обновлять измененные ими данные.
Таким образом, режим NO RECORD_VERSION НЕПРИГОДЕН для осуществления массовых выборок: записи считываются только до тех пор, пока не обнаружится конфликт.
Соответствие режимов изоляции IB и ANSI
IB |
IB API |
ANSI/ISO |
READ COMMITTED RECORD_VERSION |
isc_tpb_read_committed, isc_tpb_rec_version |
READ COMMITTED |
READ COMMITTED NO RECORD_VERSION |
isc_tpb_read_committed, isc_tpb_no_rec_version |
READ COMMITTED |
SNAPSHOT |
isc_tpb_concurrency |
SERIALIZABLE |
SNAPSHOT TABLE STABILITY |
isc_tpb_consistency |
|
Параметры транзакций
Программисты, использующие такие современные библиотеки для доступа к базам данных InterBase, как FIBPlus, IBProvider, IBX и IBObjects (см. главу "Обзор библиотек доступа к InterBase"), имеют возможность гибко управлять параметрами транзакций для получения наилучших результатов.
Настройка параметров транзакции осуществляется с помощью перечисления набора констант, определяющих поведение транзакции, например, уровень изоляции. Эти константы пришли из InterBase API и имеют следующий вид: isc_tpb_read, isc_tpb_write, isc_tpb_ read_committed и т. д. Обычно префикс isc_tpb_ опускается и константы для определения параметров транзакции пишутся без него. Давайте рассмотрим значение и синтаксис применения каждой константы.
Виды параметров транзакции
Все параметры транзакции можно подразделить на группы, каждая из которых отвечает за определенный момент в поведении транзакций. Эти группы приведены в таблице 1.4: Табл 1.4. Параметры транзакций
Группы параметров |
Константа |
Краткое описание константы |
Режим доступа |
Read |
Разрешает только операции чтения |
write |
Разрешает операции записи |
|
Режим блокировки |
Wait |
Устанавливает режим отсроченного разрешения конфликтов. См. ниже раздел "Режим блокировки" |
nowait |
При возникновении конфликта немедленно возникает ошибка |
|
Уровень изоляции |
read_committed rec_version |
Возможность читать подтвержденные данные других транзакций. Дополнительный параметр rec_version позволяет читать записи, имеющие неподтвержденные версии |
read_committed no_rec_version |
Возможность читать подтвержденные данные других транзакций. Дополнительный параметр no_rec_version не позволяет читать записи, имеющие неподтвержденные версии |
|
concurrency |
При запуске транзакции создается мгновенный "снимок" состояния базы данных (точнее, копируется "маска транзакций" на этот момент), поэтому изменения, сделанные в других транзакциях, не видны в этой транзакции |
|
consistency |
Аналогичен уровню concurrency, но помимо этого блокирует таблицу на запись. |
Режим доступа
Режим доступа определяет, какие операции могут осуществляться в контексте транзакции. По умолчанию (т. е. если ничего не указывать) ставится режим чтения-записи, т. е. могут осуществляться любые операции. Часто задают вопрос, имеет ли смысл запускать транзакции в режиме только для чтения, если не предполагается операций по изменению данных. Ответ: да, имеет. Особенно в последних клонах InterBase 6.x - InterBase 6.5, Yaffil и Firebird. Транзакции с режимом доступа только для чтения меньше нагружают сервер, так как не создают лишних версий записей. Для установки режима чтения-записи используется сочетание констант read write. Обычно константы записывают в столбик одну под другой, вот так: read write
По умолчанию установлен режим READ WRITE
Транзакция только на чтение должна обходиться "дешевле", потому что серверу не требуется отслеживать возможные изменения в БД для обнаружения конфликтов с другими транзакциями.