ドキュメントのメタデータを表示するグリッドを実装しました。ユーザーは右クリックでドキュメントを編集できます。このためのロック機構を実装したかったのです。1 人のユーザーがエディターを開いたときにドキュメントをロックする最善の方法は何でしょうか? これらのドキュメントはデータベースに存在します。
3 に答える
誰がファイルをチェックアウトしたかを示す列を追加し、それを使用したアクセスを防止します。ロックが要求されたときのタイムスタンプを追加できます。
このようにして、誰かがそれを要求し、ロックがたとえば 30 分経過しても変更が加えられていない場合、ロックを取得できます。(元のユーザーが正常に終了しなかった場合など)。
ドキュメントがデータベースにある場合、データベース自体が一貫性のないアクセスを防止するためのサポートを備えている必要があります。
http://docs.oracle.com/javase/6/docs/api/java/sql/Connection.html#setTransactionIsolation%28int%29
ただし、エディターがファイル編集中にデータベース トランザクション/接続を開いたままにせず、Java アプリケーションがサーバー側ではなくクライアント側で実行される場合 (サーバー側での同時実行のためにエディターでロックを作成するだけでよいため)データベースのフィールドを使用して編集ステータスを示すと、そのタイプのセットアップで同時実行性の問題が発生するため (データベースがそれ自体はレコードのロックをサポートしていますが、それは使用中の DB エンジンに依存します)。
ああ、1つの可能性は、ファイルの変更時間を使用し(データベースにタイムスタンプフィールドを持ち、ファイルが変更されるたびに更新する)、タイムスタンプをチェックし、ファイルを保存しようとしたユーザーが最後にアクセスした後、別のユーザーによってファイルが変更されました。その場合、ファイルはデータベースに保存されず、代わりにサーバー側のファイルが変更されたことをユーザーに警告し、変更を表示するかどうかを尋ねます (バージョン管理システムの仕組みと同様)。そのようなすべてのトランザクションに対してダーティ リードを禁止することにより、最初のトランザクションが開いている間に他のユーザーがファイルのレコードを変更するのを防ぐ必要があります (レコードを「ダーティ」としてマークするには、おそらく、トランザクションの開始時に更新されるダミー フィールドを使用できます)。ランダムな値を持つ各トランザクション)。