FireDAC ApplyUpdates 和事务控制

FireDAC ApplyUpdates and transaction control

我正在转换用 DBExpress 编写的应用程序以使用新的 FireDAC 组件。打开查询、更改过滤器或排序、在网格中显示等基本操作均正常工作。但令我惊讶的是,与 dbexpress 相比,某些函数的行为有所不同,我似乎无法理解。

我的应用程序包含数据库编辑器。当用户打开新的编辑器时 事务是通过调用方法 TFDConnection::StartTransaction 启动的。当用户单击“确定”按钮时,提交活动事务并关闭编辑器。

在编辑器中,我使用两个查询来编辑记录。在第一个查询中,我手动编写 SQL 更新命令(如“update TEST set NAME='some name' where ID=1234”)并执行它。到目前为止一切顺利。

第二个查询连接到 TDBAdvGrid(相当于 TMS Software 公司TDBGrid)并且有 CachedUpdates = true。如果我更改该网格中的某些记录,我会调用 TFDQuery::PostTFDQuery::ApplyUpdates.

Whats weird calling TFDQuery::ApplyUpdates 不仅会提交此特定查询中的未决更改,还会提交连接到 TFDConnection 实例的所有查询。我认为调用 ApplyUpdates 应该发出 SQL 更新调用但不应干扰事务控制。

我想为用户提供拒绝他在数据库编辑器中所做的所有更改的选项 window。如何正确地做到这一点?我应该将对 ApplyUpdates 的呼叫推迟到关闭 window 的时间吗?如果只需要调用 TFDQuery::ApplyUpdates,那么 TFDQuery::CommitUpdatesTFDConnection::Commit 的目的是什么?

将 TFDConnection::TxOptions::StopOptions::xoIfCmdsInactive 设为假。这也将禁用 TFDConnection::TxOptions::AutoCommit 选项,并且应用程序可以自行控制事务。