あなたの質問に対する答えは、Post、ApplyUpdates、Commitはまったく異なることを行い、通常はデータベースアプリケーションの異なる場所(プロセス)とコンテキストで発生します。 Commit
が明示的にトランザクションを完了するために、サーバー側で呼び出される必要があるかもしれない(またはしない)SQL操作であるのに対し、
Post
とApplyUpdates
は、実際に両方のクライアント側の操作です。
3層サーバーと考えると、違いを理解するのが最も簡単です。 SQLiteは、異なるマシン上の異なるプロセスからの呼び出しに応答するように設計されたソートの真のSQL Serverではないので、ちょっと奇妙なことです(3層システムのバックエンドとしても可能です)。
最も単純な従来の3層構成では、MS SQL ServerなどのSql Serverと通常はクライアントマシン上で動作するDelphiプログラムの間にある中間層のDelphiサーバーがあります。 DataSnap
クライアント層には通常、中間層のサーバー固有のTDataSet子孫を介してバックエンドSQL Serverからデータを受け取るTClientDataSet
(またはサードパーティ同等品)が含まれています。データf SQL Serverの中間層には通常、SQL Server上のトランザクションが含まれます。データがすべてクライアント層のCDSにロードされると、SQL Server上にはトランザクションが保留されません(ただし、サーバ上のオープンなトランザクションであり、サーバの他のユーザには親切ではなく、サーバ上のロックリソースを消費する(これは有限である)。
CDS(または実際のTDataset子孫)のデータを編集すると、データセットはdsEdit状態になります(TDataSetStateのオンラインヘルプを参照)。変更は暫定的です。つまり、.PostをコールしてCDSのデータに保存するまで、CDSで元に戻すことができます(TClientDataSetの場合は、呼び出し後にクライアントサイドのデータをロールバックすることができます)。 Post .ApplyUpdatesが呼び出されていない限り)。クライアント層のCDS上で.Postが呼び出されると、Sql Server上で保留中のトランザクションはないことを覚えておいてください。
.Postがでない場合、を呼び出すと、変更が対応する中間層データセットに伝播されます。これを開始するには、クライアント層CDSのApplyUpdatesを呼び出します。このCDSは、CDSと中間層のサーバー側データセットとのインタフェースをとる中間層のTDataSetProviderに波及します。実際にSQLサーバーに送信されたSQLを生成してSQLデータベースに変更を適用するのは、DataSetProvider(または、より正確にはそれに関連付けられたTSqlResolver)です。したがって、標準のDataSnap 3-tierセットアップでは、Commitの呼び出しの有無を直接制御することはできません。
Commit
は、トランザクションを完了するための2つの可能な方法の1つとしてSql Serverによって実行されるSQL操作です(もう1つはRollback
です)。 MS Sql Server(f.i.)では、サーバーへの接続が暗黙のトランザクションで受け取ったUPDATE
,INSERT
およびDELETE
ステートメントを自動的にラップするように構成されている場合があります。
あなたがトランザクション制御に関心を持つ必要がある範囲は、使用しているバックエンドサーバーと、サーバーデータの他の用途との並行性に関するアプリケーションの要件によって異なります。 SLiteのトランザクション処理に興味がある場合は、使用しているDBコンポーネントまたはそのソースコードを調べてください。
真のSQLサーバで動作するためのいくつかのDelphiコンポーネントライブラリは、サーバ側のトランザクションを制御する公開機能をサポートしています。 IBXはInterbase用です。
Btw、CachedUpdates
は、長年にわたって使用されていたBDEのハングオーバーです.BDEは、さまざまなバックエンドサーバーの一般的なDBアクセスフレームワークでのBorland初の試みでした。いくつかのTDataSet-descendant実装では存続し、(残念なことに、imo)EMBAの最新のクロスデータベース製品であるFireDACで復活しました。
DelphiコードでCommitを呼び出す必要はありません。サーバー接続は、暗黙的なトランザクションでサーバーに送信された変更をラップできます(既定で構成されることがあります)。真のサーバを持たないSQLiteの場合、Dllだけです。使用しているTDataSet-descendantコンポーネントに依存している可能性があります。ドキュメントやソースコードをチェックします。 – MartynA