数据库的 Post、ApplyUpdates 和 Commit 之间有什么区别?

What's the difference between Post, ApplyUpdates, and Commit for databases?

我正在努力找出更改数据库后要使用的命令。我正在通过 SQLite3 和 db-aware 控件学习,这是我的理解 ...

当用户在 db-aware 控件中键入某些内容(或以其他方式将内存中的数据集置于编辑状态)时,POST 会将更改存储在内存中。控件通常会自动或隐式地为您执行此操作。

虽然您必须 post 在任何地方识别任何更改之前,更改尚未发送到磁盘上的实际数据库文件。它们只存在于记忆中。将更改发送到磁盘需要 APPLYUPDATES

即使通过 APPLYUDATES 发送到磁盘上的文件后,它们仍然可以 更改或回滚。这就像点击撤消。在调用 COMMIT 之前,它们不会永久保存到磁盘。

这听起来对吗?我真的很想知道我在做什么,所以我不只是复制和粘贴代码。但请随时在您的回复中复制、粘贴和编辑我的尝试。

当您使用 ApplyUpdates 时,您必须设置 CachedUpdates 属性 为真。然后 您可以使用 post、删除(以及其他)来更改您的数据,这些 更改将首先放入缓存中。 调用 ApplyUpdates 时,您所做的所有更改都存储在 数据库。使用取消更新 您可以撤消所做的所有更改。 当您将 CachedUpdates 属性 设置为 false 时,您将进行所有更改 已取得将直接 存储到数据库中。 ApplyUpdate 和 CancelUpdates 命令可以 不被使用。

您的问题的答案是 Post,ApplyUpdates 和 Commit 做完全不同的事情,通常出现在数据库应用程序的不同位置(进程)和上下文中。

PostApplyUpdates 都是真正的 client-side 操作,而 Commit 是一个 SQL 操作,可能需要(或不需要)显式调用服务器端完成交易。

如果考虑 three-tier 服务器,则最容易理解差异。 SQLite 有点古怪,因为它不是真正的 Sql 服务器,旨在响应来自不同机器上不同进程的调用(尽管它可以像 back-end 三层系统_.

关于最简单的传统 3 层安排有一个 middle-tier Delphi 服务器位于 Sql 服务器之间,比如 MS Sql 服务器,和 client-tier,通常是客户端计算机上的 Delphi 程序 运行。 Borland/EMBA实现这个的传统技术是DataSnap

客户端层通常包含一个 TClientDataSet(或第 3 方等价物),它通过 server-specific TDataSet 后代从 back-end SQL 服务器接收数据中间层。虽然从Sql服务器获取数据到中间层通常会涉及Sql服务器上的事务,但是一旦数据全部加载到客户端的CDS中,就没有事务挂起。 SQL 服务器(除非你特意在服务器上保持事务打开,这对服务器的其他用户不友好,并且会消耗服务器上有限的锁资源)。

当您在 CDS(或任何 TDataset 后代)中编辑数据时,会将数据集置于 dsEdit 状态(请参阅 TDataSetState 的联机帮助)。所做的更改是临时的,这意味着它们可以在 CDS 中撤消,直到您调用 .Post,它会将它们保存到 CDS 的数据中(在 TClientDataSet 的情况下,对 client-side 数据的更改可以是在调用 .Post 后回滚事件,只要 .ApplyUpdates 没有被调用)。请记住,当在客户端层的 CDS 上调用 .Post 时,Sql 服务器上没有待处理的事务(或者至少不应该有)。

调用 .Post 不会 导致更改传播回对应的 middle-tier 数据集。要启动它,您可以在 client-tier CDS 上调用 ApplyUpdates,它会传递到中间层的 TDataSetProvider,它将 CDS 与 middle-tier 的 server-facing 数据集连接起来。它是生成 SQL 的 DataSetProvider(或者更准确地说,是与其关联的 TSqlResolver),它实际上被发送到 SQL 服务器以将更改应用到 SQL 数据库。因此,在标准的 DataSnap 3 层 set-up 中,您无法直接控制是否调用 Commit。

Commit 是由 Sql 服务器执行的 SQL 操作,作为完成交易的两种可能方式之一(另一种是 Rollback)。使用 MS Sql 服务器,f.i,与服务器的连接可以配置为自动将接收到的 UPDATEINSERTDELETE 语句包装在隐式事务中.

您需要关注事务控制的程度取决于您所使用的 back-end 服务器以及您的应用程序在与其他服务器数据使用的并发性方面的要求。如果您对 SLite 的交易处理感兴趣,请查阅您正在使用的数据库组件或其源代码的文档。

一些 Delphi 用于处理真实 SQL 服务器的组件库确实支持用于控制 server-side 事务的公开设施,例如Interbase 的 IBX。

顺便说一句,在 Delphi 术语中,CachedUpdates 是来自 long-obsolete BDE 的 hang-over,这是 Borland 首次尝试通用 DB-access 框架各种 back-end 服务器。它在某些 TDataSet-descendant 实施中仍然存在,并且(遗憾的是,imo)在 EMBA 最新的 cross-database 产品 FireDAC 中卷土重来。