根据文档,Firebird 中有四个事务隔离级别。但是,据我所知, uib库(TUIBTransaction)中没有明确的隔离级别选择,而是一堆事务选项。我应该如何使用这些?某处有文档吗?
1 回答
这些选项将改变隔离级别。正如@Arioch 在他的紧凑评论中所说,您可以更改隔离级别,从而更改Options
type的属性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 手册中。
你可以在这里得到它们https://www.firebirdsql.org/en/reference-manuals/
下面我在此链接中引用 Ann Harrison来快速解释所使用的常用选项:
isc_tpb_consistency 可能会导致性能问题,因为它会锁定表并可能排除并发访问。isc_tpb_concurrency 是 Firebird 的设计中心。阅读器不会阻塞写入器,写入器不会阻塞读取器,并且两者都能获得一致的数据库视图。
isc_tpb_read_committed + isc_tpb_rec_version + isc_tbp_read_only 给出不一致的结果,并且偶尔会在 blob 读取时产生错误*,但与其他模式不同,它不会阻止垃圾收集,因此对于无需获得“正确”的长时间运行的读取事务来说,这是一个很好的模式“ 回答。
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_”部分并不难理解。