1

インスタンス B がレコードがロックされていることを認識できるように、インスタンス A からレコードをロックする方法を見つけたいと思います。

GUI の動作は次のとおりです。

インスタンス A で、ユーザーはエンティティ E の変更を要求します。プログラムは何かをチェックし (トークンの予約を試みますか? 何か他のものを試しますか? ...)、E が空いている場合は変更ダイアログを表示します。

インスタンス A がEを予約でき、インスタンス B が同じウィンドウを開きたいとします。B はレコードをロックしようとします (解決策はまだ見つかっていません)。A は既にそこにあるため、B はコンサルテーションダイアログのみを表示します。

私は使っている :

  • ジャワ
  • 各インスタンスで休止状態にする
  • postgresql (使用できるロック動作があるかもしれません?)

注:テーブル全体ではなく、テーブルの1つのレコードのみをロックしたい。

誰かが私に何を使うべきかについてのヒントを教えてくれますか?また、インスタンス A がクラッシュした場合にロック解除保護を管理する方法も教えてもらえますか?

前もって感謝します。

4

1 に答える 1

1

あなたが望むのはselect for update. これにより、行がロックされ、他のトランザクションによる書き込みや書き込みロックの取得が防止されます。問題は、別のトランザクションも試してみるとどうなるかというselect for updateことです。すぐに例外をブロックするかスローするかはわかりません。あなたはそれを試してみるべきです。

Hibernate: http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/transactions.htmlセクション 11.4 Postgress: http://www.postgresql.org/docs/9.1/static/explicit-locking .html

このソリューションでは、アプリがクラッシュした場合にトランザクションが終了し、ロックが解除されるため、古いロックについて心配する必要はありません。クライアントが十分に速くなったことを DBMS が認識しない場合は、いつでもデータベース上でそのトランザクションを直接強制終了できます。

于 2013-10-01T00:31:03.843 に答える