代码之家  ›  专栏  ›  技术社区  ›  Al C

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

  •  10
  • Al C  · 技术社区  · 9 年前

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

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

    尽管您必须在任何地方识别任何更改之前发布,但这些更改尚未发送到磁盘上的实际数据库文件。它们只在记忆中。将更改发送到磁盘需要 APPLYUPDATES .

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

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

    2 回复  |  直到 9 年前
        1
  •  13
  •   MartynA    9 年前

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

    Post ApplyUpdates 都是真正的客户端操作,而 Commit 是一个SQL操作,可能需要(或不需要)在服务器端显式调用它来完成事务。

    如果考虑三层服务器,最容易理解它们的区别。SQLite有点古怪,因为它不是真正的Sql Server,它的设计目的是响应来自不同机器上不同进程的调用(尽管它可以作为三层系统的后端)。

    最简单的传统三层结构有一个中间层Delphi服务器,它位于Sql server(例如MS Sql服务器)和客户端层(通常是在客户端机器上运行的Delphi程序)之间。Borland/EMBA实现这一点的传统技术是 DataSnap .

    客户端层通常包含 TClientDataSet (或等效第三方)通过中间层中特定于服务器的TDataSet子体从后端SQL Server接收数据。尽管将数据从Sql Server获取到中间层通常涉及Sql服务器上的事务,SQL Server上没有挂起的事务(除非您特意在服务器上打开事务,这对服务器的其他用户不友好,并且会消耗服务器上的锁资源,这是有限的)。

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

    正在打电话。Post正在打电话 导致更改传播回对应的中间层数据集。首先,在客户机层CD上调用ApplyUpdate,它会波及到中间层的TDataSetProvider,后者将CD与中间层面向服务器的数据集相连接。生成SQL的是DataSetProvider(或者更准确地说是与其关联的TSqlResolver),该SQL实际上被发送到SQL服务器,以将更改应用到SQL数据库。因此,在标准的DataSnap 3层设置中,您无法直接控制是否调用Commit。

    犯罪 是SQL Server执行的SQL操作,作为完成事务的两种可能方式之一(另一种是 Rollback ). 对于MS Sql Server,例如,到服务器的连接可以配置为自动包装接收到的 UPDATE , INSERT DELETE 隐式事务中的语句。

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

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

    顺便说一句, CachedUpdates 这是Borland首次尝试为各种后端服务器提供通用数据库访问框架。它在一些TDataSet后代实现中仍然存在,并且(遗憾的是,imo)在EMBA最新的跨数据库产品FireDAC中卷土重来。

        2
  •  -1
  •   Iresha Rubasinghe    9 年前

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