シナリオ:保存関数は、最初にデータベース内のテーブルから行の総数を読み取ります。行数に基づいて、一意の入力値が計算されます。この値は、同じテーブルに挿入される行に含まれます。
問題:同じオブジェクトの2つのインスタンスが、同時に保存機能を実行します。ここで「同時」とは、アプリケーションがデータベースから読み取り、データベースに行を挿入するのにかかる時間です。したがって、たとえば、
ユーザーAが保存ボタンをクリックします>>テーブルに3つの行があることを読み取ります>>新しい行の一意の入力値としてf(3)を計算します>>テーブルに挿入する新しい行を準備します...
ユーザーBが保存ボタンをクリックします>>(ユーザーAが新しい行を挿入していないため)テーブルに3つの行があることを読み取ります>>一意の値ではないf(3)を計算します(エラー!)>>..。
この状況を修正するにはどうすればよいですか?残念ながら、抽象化されたORMレイヤーが使用されているため、dbトランザクションロジックを変更できません。ただし、コードは完全に制御できます。どんな提案も非常に役に立ちます。
私はすでにsave関数の周りにlock()を配置しようとしましたが、どういうわけか役に立ちません。