2012-03-16 10 views
0

今日、私はJTA apiについて読んで、私はUserTransactionManagerというクラスを見た。 SQLクエリを実行する前にトランザクションを開始する必要があるため、例外が発生した場合は変更をロールバックできます。UserTransactionManagerが正確にやっていること

ここで私の質問は、UserTransactionManagerがやっていることです。任意のスタックを提供しています.. SQLクエリを実行する?どのようにSQLクエリの変更をロールバックされますか?

答えて

1

UserTransactionManagerはインターフェイスです。コンテナは実行時に実装を提供します。

2フェーズコミットと呼ばれるプロセスでは、「ソフトコミット」が発生し、行はリムボウで保持され、その後はハードコミットされます。

XAプロトコルを使用してトランザクションを開いたときにコンテナがデータベースと通信し、「接続しても、実際にはディスクにコミットしませんあなたそう。 "

次に、いくつかのクエリを実行し、それらをデータベースにフラッシュします。あなたのコンテナをフラッシュするときにデータベースに "こんにちは、これらのクエリを実行しますが、私があなたに言うまでは何も書きませんが、スローとエラーを直ちに成功させることができない場合は書き込みしません。あなたが私からもう一度私のことを聞くまで私はあなたにコミットするOKを与えます。

最後に、プログラムによってUserTransactionがクローズされます。その後、コンテナはデータベースに「ロックしたすべての行を確認し、すべてをディスクにフラッシュ(コミット)してロックを解除します」と言います。

グローバルトランザクションを調整している場合は、実際にはもっと複雑ですが、基本的にすべての参加者がコミットを保証できるとすれば、コミットするか、誰もコミットしません。

さらに読書:

+0

は、あなたの迅速な返事をいただき、ありがとうございます。回答ごとに、コンテナはトランザクションのコーディネータとして機能します。プログラム型トランザクションの場合は、UserTransactionManagerがコーディネータとして機能しますか? –

+0

これは実際にはトランザクションを管理するコンテナです。 UserTransactionManagerを使用すると、トランザクションをいつどこで終了するかをアプリケーションがコンテナに伝えることができます。 –

+0

あなたの答えをありがとう。 –

関連する問題