Как использовать уровни изоляции транзакций Firebird с UIB?
Согласно документам, в Firebird есть четыре уровня изоляции транзакций. Однако, насколько я знаю, в библиотеке UIB нет явного выбора уровня изоляции (TUIBTransaction), но есть множество вариантов для транзакций. Как я должен их использовать? Где-нибудь есть документация?
1 ответ
Эти куча вариантов - это то, что изменит уровень изоляции. Как сказал @Arioch в своем компактном комментарии, вы можете изменить уровень изоляции, изменив свойство Options
это типа TTransParams
, Это набор TTransParam
как ниже.
// Transaction parameters
TTransParam = (
{ prevents a transaction from accessing tables if they are written to by
other transactions.}
tpConsistency,
{ allows concurrent transactions to read and write shared data. }
tpConcurrency,
{ Concurrent, shared access of a specified table among all transactions. }
{$IFNDEF FB_21UP}
tpShared,
{ Concurrent, restricted access of a specified table. }
tpProtected,
tpExclusive,
{$ENDIF}
{ Specifies that the transaction is to wait until the conflicting resource
is released before retrying an operation [Default]. }
tpWait,
{ Specifies that the transaction is not to wait for the resource to be
released, but instead, should return an update conflict error immediately. }
tpNowait,
{ Read-only access mode that allows a transaction only to select data from tables. }
tpRead,
{ Read-write access mode of that allows a transaction to select, insert,
update, and delete table data [Default]. }
tpWrite,
{ Read-only access of a specified table. Use in conjunction with tpShared,
tpProtected, and tpExclusive to establish the lock option. }
tpLockRead,
{ Read-write access of a specified table. Use in conjunction with tpShared,
tpProtected, and tpExclusive to establish the lock option [Default]. }
tpLockWrite,
tpVerbTime,
tpCommitTime,
tpIgnoreLimbo,
{ Unlike a concurrency transaction, a read committed transaction sees changes
made and committed by transactions that were active after this transaction started. }
tpReadCommitted,
tpAutoCommit,
{ Enables an tpReadCommitted transaction to read only the latest committed
version of a record. }
tpRecVersion,
tpNoRecVersion,
tpRestartRequests,
tpNoAutoUndo
{$IFDEF FB20_UP}
,tpLockTimeout
{$ENDIF}
);
Поскольку код Interbase 6.0 "с открытым исходным кодом", документация по API не сильно изменилась. Поэтому, если вы хотите получить пояснения по любому из них, документы, которые вы ищете, находятся в руководствах Interbase.
Вы можете получить их здесь http://www.firebirdsql.org/en/reference-manuals/
Ниже я процитирую Энн Харрисон в этой ссылке для быстрого объяснения обычных используемых опций:
isc_tpb_consistency может вызвать проблемы с производительностью из-за того, что он блокирует таблицы и, возможно, исключает параллельный доступ. isc_tpb_concurrency - это дизайнерский центр для Firebird. Читатели не блокируют писателей, писатели не блокируют читателей, и оба получают согласованное представление о базе данных.
isc_tpb_read_committed + isc_tpb_rec_version + isc_tbp_read_only дает противоречивые результаты и иногда выдает ошибку при чтении большого двоичного объекта *, но, в отличие от других режимов, не блокирует сборку мусора, поэтому это хороший режим для длительных транзакций чтения, которые не должны получить "право" " ответ.
isc_tpb_read_committeed + isc_tpb_rec_version имеет ту же производительность, что и isc_tpb_concurrency, но получает противоречивые результаты - один и тот же запрос, выполненный дважды в одной и той же транзакции, может вернуть разные строки.
isc_tpb_read_committed + isc_tpb_no_rec_version + isc_tpb_wait работает медленнее, чем другие режимы, потому что будет ожидать изменения, которое будет зафиксировано, а не читать последнюю подтвержденную версию. Как и все варианты isc_tpb_read_committed, он не дает согласованных результатов.
isc_tpb_read_committed + isc_tpb_no_rec_version + isc_tpb_no_wait дает множество и много тупиковых ошибок, потому что каждый раз, когда читатель встречает измененную запись, он возвращает ошибку.
ПРИМЕЧАНИЕ: я надеюсь, что вы видите, что, если параметры не имеют одинаковых имен, это не так сложно понять, если вы удалите часть "isc_tpb_".