2016-01-24 2 views
5

私は、データベースを変更した後に使用したいコマンドを理解するのに苦労しています。Post、ApplyUpdates、Commitの違いは何ですか?

ユーザがDB対応のコントロールに何かを入力した場合(またはメモリ内のデータセットを編集状態にする場合)、POSTは、データベースに格納されたデータを格納します。メモリの変更。コントロールは、自動的に、または暗黙的に、これを行う場合があります。

変更がどこにでも認識される前に投稿する必要がありますが、変更はディスク上の実際のデータベースファイルに送信されていません。彼らは唯一の記憶にあります。変更をディスクに送信するにはAPPLYUPDATESが必要です。

APPLYUDATES経由でディスク上のファイルに送信した後でも、を変更またはロールバックすることができます。それは元に戻すことのようなものです。それらは、COMMITが呼び出されるまでディスクに永久保存されません。

これは正しいですか?私は本当に何をしているのか知りたいので、コードをコピーして貼り付けるだけではありません。しかし、あなたの返事で私の試行をコピーして貼り付け、編集してください。

+0

DelphiコードでCommitを呼び出す必要はありません。サーバー接続は、暗黙的なトランザクションでサーバーに送信された変更をラップできます(既定で構成されることがあります)。真のサーバを持たないSQLiteの場合、Dllだけです。使用しているTDataSet-descendantコンポーネントに依存している可能性があります。ドキュメントやソースコードをチェックします。 – MartynA

答えて

10

あなたの質問に対する答えは、Post、ApplyUpdates、Commitはまったく異なることを行い、通常はデータベースアプリケーションの異なる場所(プロセス)とコンテキストで発生します。 Commitが明示的にトランザクションを完了するために、サーバー側で呼び出される必要があるかもしれない(またはしない)SQL操作であるのに対し、

PostApplyUpdatesは、実際に両方のクライアント側の操作です。

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で復活しました。

+1

ご連絡いただきありがとうございます。それはかなり役に立ちます。 ...フォローアップするだけで、サーバが 'COMMIT'コマンドを送る必要がある場合、' ApplyUpdates'の前かそれ以降でしょうか?メインサーバーに更新を送信する呼び出しの前にコード化されているようです。 –

+0

具体的には、バックエンドサーバーへのSQL COMMIT文を意味する場合は、** ApplyUpdatesの後に必ず**する必要があります。これは、ApplyUpdatesが実行されてから、必要なSQL UPDATEコマンドがバックエンドサーバーコミットされているトランザクションに含まれる変更を行います。 – MartynA

-1

ApplyUpdatesを使用している場合は、CachedUpdates プロパティをTrueに設定する必要があります。その後、 投稿を使用してデータを変更するために、残りの部分を削除すると、 の変更が最初にキャッシュに入れられます。 ApplyUpdatesを呼び出すと、すべての変更が データベースに保存されます。 CancelUpdates を使用すると、行ったすべての変更を元に戻すことができます。 CachedUpdatesプロパティをfalseに設定すると、 が行ったすべての変更は、直接 にデータベースに格納されます。 ApplyUpdateコマンドとCancelUpdatesコマンドは、 を使用できません。

+1

だから、 'COMMIT'は何をしますか? –

+0

COMMIT文を使用して、現在のトランザクションを終了し、トランザクションで実行されたすべての変更を永続化します。変更を保存します。 –

+1

私に応答する時間を取ってくれてありがとう、Iresha、 –

関連する問題