2011-07-14 7 views
0

まず、JDBCのようなトランザクションApisのこれらの特性や責任に従うのは開発者の責任であることを確認したいと思いますか?以下はJDBCを使用してACIDプロパティを取得するには?

我々はJDBC

不可分で酸特性を達成する方法私の理解である: - そこに接続に関連付けられた1つのトランザクションがあるので、我々がコミットまたはロールバックかのように、部分的なupdation.Henceが

を達成していないがありますConsitency: - 一部のデータ整合性制約が揺れる(いくつかのチェック制約がある)場合、sqlexceptionがスローされます。プログラマはトランザクションをロールバックして一貫したデータベースを起動しますか?

上記の1つの質問では、トランザクション1を実行し、トランザクション2ではSQLの例外がスローされます(前述の説明を参照)。今我々は例外をキャッチし、最初のトランザクションはコミットされますか?

分離: - JDBC Apisによって提供されます。しかし、これは同時更新の問題につながります。それで、それは手で正しく扱われましたか?

耐久性: - JDBC Apis。

上記のご理解があれば教えてください。

答えて

2

トランザクションインテグリティのACID原則は、API(JDBCなど)ではなくアプリケーションによって実装されます。アプリケーションの責任は、必要なトランザクションの整合性をサポートし、アプリケーションのトランザクション境界を正しく識別するデータベースとデータベース構成を選択することです。

例外がスローされると、アプリケーションはトランザクション全体をロールバックするか、追加の処理を続行するのが適切かどうかを判断する必要があります。アプリケーションがベンダーからの注文を処理している場合(たとえば、成功した99個の注文を処理し、ユーザーが調査するためにどこかで失敗した1注文をログに記録するなど)は適切です。一方、1件が失敗したため、100件すべての注文を拒否することができます。アプリケーションによって何が行われているかによって異なります。

一般に、一度に1つのトランザクションのみを開くことができます(または、より正確には、接続ごとに1つのトランザクション)。したがって、トランザクション2で作業している場合、トランザクション1の定義はすでに完了しています。これは以前にコミットまたはロールバックされています。トランザクション2でスローされた例外は、トランザクション1に影響しません。

アプリケーションの要求(およびデータベースがサポートするトランザクション分離レベル)とアプリケーションの仕組みに応じて、失われた更新は、心配する必要があるかもしれません。トランザクションの独立性レベルをコミット読込みに設定すると、トランザクション1で値を 'A'と読み、ユーザーが何かを実行するのを待って値を 'B'に更新し、トランザクションを認識せずにコミットする可能性があります2は、データを読み込んだときからデータを書き込んだときまでの間に値を 'C'に更新しました。これはあなたが対処する必要がある問題かもしれないし、最後の人が行を "勝つ"ように更新するのが良いかもしれません。

一方、データベースでは、2つのトランザクションが同じテーブルの同じ行を同時に更新できないようにする自動ロックが必要です。それは厳密に必要以上にロックすることでこれを行うかもしれませんが、何とか更新をシリアル化します。

関連する問題