1

データベース サーバーにテーブル ( と呼びましょうmyTable) があり、myTable のレコードを変更できるデスクトップ クライアント アプリケーションを作成しているとします。2 人のユーザーが同じレコードを編集できるようにしたくありません。つまり、ユーザー A がレコード 1 を編集し、ユーザー B が同じことをしようとすると、レコードが現在ユーザー A によって「ロック」されていることが通知されます。

これはよくある問題だと確信しているので、標準的な解決策があるかどうか疑問に思っています。


明らかな解決策がありますが、明らかな欠点もあります。

  • inUseByにフィールドを追加しmyTable、ユーザーがレコードの編集を開始したらユーザーの名前に設定し、ユーザーが終了したらそれをクリアします。

    function editRecord(recordId):
        begin transaction
        if (select lockedBy from myTable where id = recordId) is not empty:
            commit
            show "Sorry, record already in use by ..."
        else
            update myTable set lockedBy = current_user() where id = recordId
            commit
            show UI window to let user edit and update record
            update myTable set lockedBy = empty where id = recordId
    

    欠点: ユーザー A のアプリケーションがクラッシュした場合、レコードはロックされたままになります。

次のアプローチは一見適切に見えるかもしれませんが、問題は解決しません。

  • データベース ロックを使用してレコード 1 をロックします。これにより、ユーザー B がタイムアウトになるだけです。データベース レベルではなく、アプリケーション レベルでレコードをロックする必要があります。
4

1 に答える 1