1

次のシナリオがあります。私は2つのテーブルを持っています。1 つは、トランザクションのカウンターである複数の値を格納します。Java アプリケーションを介して、最初のテーブルの値が読み取られ、インクリメントされて 2 番目のテーブルに書き込まれ、新しい値が最初のテーブルに書き戻されます。複数ユーザーのシステムであるため、明らかにこれがうまくいかない可能性があります。Java での問題に対する私の解決策は、いずれかのテーブルでアクションを実行する前に取得する必要があるロックを提供することです。これらのロック (ReentrantLocks) は静的であり、値が互いに完全に独立しているため、表 1 の列ごとに 1 つ存在します。

これは推奨されるアプローチですか?

乾杯。

4

2 に答える 2

5

いいえ。データベースの同時実行には、暗黙的なデータベース ロック1を使用します。リレーショナル データベースは、 ACIDの重要な部分であるトランザクションをサポートします。トランザクションを使用します。

Java 中心のロックはクロス VMでは機能しないため、マルチユーザー/サーバー環境では役に立ちません。


1データベースは、一貫性と分離を確保するためにロックを取得/解放するのに十分スマートであり、MVCC などの「ロックフリー」実装を使用することさえできます。明示的なデータベース ロックを要求する必要がある場合がまれにありますが、これは高度な使用例です。

于 2012-10-08T22:55:24.017 に答える
1

@pstの回答の感情のいくつかに同意しながら、これはわずかに依存していると思います.

イベントのシーケンスが本質的に "SQL 指向" であり、おそらく常にそうである場合は、データベース レベルでロックを行うこともできます (実際、おそらくトランザクションを使用して暗黙的に)。

ただし、アプリ層内に重要なデータ操作ロジックがある場合、または組み込むことを計画している場合 (一般的に、またはこの特定の操作の場合)、アプリ レベルでロックする方が適切な場合があります。(実際には、実際には両方のレベルでロックしているように、SQL をトランザクションで実行する可能性があります。)

複数の VM の問題は、DB レベルのロックに依存すること自体が必ずしも切実な問題であるとは思いません。複数のサーバー アプリがデータベースにアクセスしている場合、どのような場合でも、どのような状況でデータが同時にアクセスされるかについて、明確に定義されたプロトコルを確立する必要があります。また、中程度の複雑さのシステムでは、データに対して定期的なサニティ チェックを実行するシステムを構築する必要があります。(サーバー アプリが常に 100% 完璧に動作していたとしても、バックエンドのテクニカル サポートがアプリ外のデータベースでさまざまな SQL を実行する必要がなくなるでしょうか?)

于 2012-10-09T00:22:17.130 に答える