Database 单个用户应用程序的整个生命周期中的一个活动IB事务

Database 单个用户应用程序的整个生命周期中的一个活动IB事务,database,delphi,transactions,firebird,interbase,Database,Delphi,Transactions,Firebird,Interbase,当一个单用户应用程序只使用一个IB事务时,有没有任何负面影响?只要程序运行,该事务就处于活动状态?仅使用CommitRetaining和Rollback固定 背景:我想使用IBQuery并将它们连接到一个数据库网格(DevExpress),该网格可以一次将所有记录加载到内存中。因此,我希望避免在每个SQL insert命令之后重新获取所有数据。 IBTransaction.Commit将关闭数据集。我觉得您试图使用数据库功能是为了避免使用TClientDataSet,这显然是目前在Delphi中

当一个单用户应用程序只使用一个IB事务时,有没有任何负面影响?只要程序运行,该事务就处于活动状态?仅使用CommitRetaining和Rollback固定

背景:我想使用IBQuery并将它们连接到一个数据库网格(DevExpress),该网格可以一次将所有记录加载到内存中。因此,我希望避免在每个SQL insert命令之后重新获取所有数据。
IBTransaction.Commit将关闭数据集。

我觉得您试图使用数据库功能是为了避免使用
TClientDataSet
,这显然是目前在Delphi中工作的首选方式。为什么要不厌其烦地使用有问题的事务实践,而不是遵循更常见的数据库组件使用模式,这已经是解决当前问题的更好方法了?

提交保留和回滚保留并不好


交易时间必须很短。

你说得对:)我已经想了很久了,我该怎么办。直接使用TIBQuery或TClientDataset。IBQuery有一些很好的设计时特性(例如SQLUpdate),这使得RAD开发明显更容易。我还有些担心,附加层是否会带来更多麻烦,使开发更加复杂,降低性能。实际上,对于单用户应用程序,我不确定哪种方法更好。你有一些指南吗?毫无疑问,至少在表面上,使用
TClientDataSet
比不使用它更复杂。然而,一旦你学会了使用它,你就可以使用这些技能来解决各种各样的问题,如果没有它,你就无法解决这些问题(或者没有其他的组件来完成它的功能)。对于我编写的每个Delphi数据库应用程序,包括我的免费IB性能分析工具,我都使用
TClientDataSet
。您能详细说明一下吗?为什么这些方法不好?为什么交易需要做空?它们必须有多短?这在IB的旧版本中是正确的,但在当前版本中不再是正确的,除非您使用快照隔离。Rob,如果您使用的是快照隔离,那么服务器必须保留旧的记录版本,这会阻止IB服务器的垃圾收集器工作,这意味着每个SELECT必须遍历许多记录版本,以找到用户事务可见的记录版本。即使当前事务不是快照,也是如此。在旧版本的IB中,即使是非快照事务也会干扰垃圾收集。这是固定的年份ago@Craig:你知道火鸟也是这样吗?不知道;很抱歉IIRC这在IB 7或7.1中已修复。如果您使用Firebird,我建议您不要使用此功能。