Firebird只读事务

3
使用Firebird只读事务的优势是什么?我已经使用Firebird数据库超过七年了,但从未使用过这个选项。我只是好奇这个功能的典型应用场景是什么?我正在使用Firebird 2.5.x,如果您对Firebird 3.x(或更新版本)有有用的见解,欢迎您的评论。
3个回答

2
Firebird中只读事务的主要优点是该事务不持有记录版本。因此,垃圾收集器可以有效地清除它们。
另外,正如上面提到的,只读事务永远不会阻塞其他事务。
为了提供最大的性能并最小化事务死锁的风险,应用程序应使用短的“更新”事务和一个长期的只读事务(READ COMMITTED、REC VERSION)来“读取”数据。

1
在事务生效期间,您将看到数据库的一致视图 - 其他连接或会话的数据修改(删除/更新/插入)不可见。
通常用于组合报告,其中您针对相同数据运行多个查询以以不同方式显示它。如果每个查询独立运行,则报告可能不一致,因为后续查询可能会看到不同的数据。
不特定于Firebird - “只读事务”是一个常见的数据库短语,您可以搜索更多信息。

如果事务隔离级别是读取已提交,那会怎样?在这种情况下,其他事务所做的更改是否仍然不可见?我在Firebird文档中看到只读和事务隔离级别是不同的东西。(https://firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-transacs-statements.html#fblangref25-transacs-settransac) - truthseeker
@truthseeker 事务只能看到它们被允许看到的数据。对于读取提交的事务,这意味着它在读取发生之前看到了已提交的状态,对于快照和并发性,它在事务开始之前看到了已提交的状态。无论您使用只读还是读写事务,这都不会改变。 - Mark Rotteveel

1

Firebird 中的只读事务使用预提交事务(虽然仍需要用 COMMIT 结束)。它不能更改数据库(除了全局临时表,这些表是 on commit delete rows ),也不能锁定行或表。它确实提供了事务配置的可见性保证。

使用只读事务的好处是它保证该事务不会阻塞其他事务。但是,由于 Firebird 中大多数读操作不会阻止其他事务,因此该好处并不太大。

此外,您可以使用只读事务来验证事务是否直接或间接修改了数据库。


1
它不会修改数据库的“逻辑视图”。它仍然可以创建许多Blob,尽管这些Blob将在事务结束时被删除...但由于只读事务往往存在很长时间,正是因为它们不改变任何东西并且不花费任何代价,所以这个陷阱可能非常重要。 - Arioch 'The

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接