データベース サーバーにテーブル ( と呼びましょう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 がタイムアウトになるだけです。データベース レベルではなく、アプリケーション レベルでレコードをロックする必要があります。