3

問題があり、この状況で database isolationtype == Serializable を使用することを考えていますが、一連の記事を読んだ後でも、それが以下の問題の解決策であるとは確信していません。

セットアップ:

Weblogic cluster > 2 servers
Simple Java JDBC
Servlets, EJB Session beans 2.0

テーブルがLANあり、クライアントからの入力に基づいて一致する値を選択します。

LAN

lan_id   | name | some_values | is_available
-------------------------------------
13       |  ss  | 3234        | yes 
12       |  sssd| 3234        | yes
14       |  sssd| 3234        | yes
15       |  ssaa| 3234        | yes

ビジネス ロジックでは、LAN から一致する行を選択し、別のテーブルを保存する必要があります。LAN_Assignment

LAN_割り当て

lan_id   | lan_assg_id | some other columns
-------------------------------------------

select ステートメントを実行すると、LAN テーブルから一致する行を取得し、それを lan_assignment テーブルに割り当てます。

ここで、クライアント (クラスター内の任意のサーバーである可能性があります) から 5 つの要求が送信された場合、それらはすべて最初に使用可能な LAN を選択し、それを他のテーブルに保存します。

LAN を取得した最初の要求が、クライアントからの 2 番目の要求によって選択されないようにするにはどうすればよいですか?

PS: select ステートメントとビジネス ロジックは、ここで説明したように単純ではありません。LANを選んでLan_assignmentに保存するなど条件はいろいろありますが、

ありがとうございました

4

3 に答える 3

2

目的に応じてSKIP LOCKEDを使用できます。これにより、セッション 1 が行をロックすると、セッション 2 はそれをスキップして次を処理できます。10gにもあったと思いますが、文書化されていません。

于 2015-03-04T22:05:07.030 に答える
1

Serializable 分離​​は問題の解決策ではありません (ただし、そのままにしておいてください!)

これらの 5 つの同時要求を処理するためのいくつかの代替手段があります (シナリオに従って)。1 つは、これらのトランザクションのうち 4 つが失敗し、1 つだけが成功することです。一意の制約または楽観的ロックを使用してこれを行い、これが原因で失敗した操作を再試行できます (ただし、数回再試行すると失敗することを忘れないでください)。

別の方法として、行ロックを使用することもできます。ボリュームがそれほど大きくない場合、このアプローチはうまく機能するはずです。

于 2015-03-04T22:02:19.603 に答える
1

Oracle 10g には文書化されていない更新用の SKIP LOCKED があります。私はそれを解決策として使用しています (以下のオプション 3 を参照)。

このシナリオを処理するための他のオプションをどのように試しましたか。

Option 1:以下のオプションは、トランザクションが完了するまで行をロックします。他のすべてのトランザクションは、最初のトランザクションによってロックが解放されるのを待ち続けます。トランザクションが非常に長い時間待機したままになり、デッドロックが発生する可能性があるため、これは少し危険です。

select .. where .. for update

Option 2:(Nowait) 行が他のトランザクションによってロックされている場合、これは待機しません。Oracle エラーが返されます。ユーザーにエラーを表示する前に、例外をキャッチして 10 秒待ってから、さらに 4 ~ 5 回試行します。

select .. where... for update nowait

オプション 3: (スキップ ロック) これは、他のトランザクションによってロックされている行をスキップします。これは、他のトランザクションによってロックされている行を使用したくないため、目的を果たします。

select...where ... for update skip locked
于 2015-03-05T15:22:06.220 に答える