0

シナリオ:保存関数は、最初にデータベース内のテーブルから行の総数を読み取ります。行数に基づいて、一意の入力値が計算されます。この値は、同じテーブルに挿入される行に含まれます。

問題:同じオブジェクトの2つのインスタンスが、同時に保存機能を実行します。ここで「同時」とは、アプリケーションがデータベースから読み取り、データベースに行を挿入するのにかかる時間です。したがって、たとえば、

  • ユーザーAが保存ボタンをクリックします>>テーブルに3つの行があることを読み取ります>>新しい行の一意の入力値としてf(3)を計算します>>テーブルに挿入する新しい行を準備します...

  • ユーザーBが保存ボタンをクリックします>>(ユーザーAが新しい行を挿入していないため)テーブルに3つの行があることを読み取ります>>一意の値ではないf(3)を計算します(エラー!)>>..。

この状況を修正するにはどうすればよいですか?残念ながら、抽象化されたORMレイヤーが使用されているため、dbトランザクションロジックを変更できません。ただし、コードは完全に制御できます。どんな提案も非常に役に立ちます。

私はすでにsave関数の周りにlock()を配置しようとしましたが、どういうわけか役に立ちません。

4

1 に答える 1

0

結局、DBで生成されたID(自動インクリメント)を利用して計算を行いました。行数とIDが同期していないため、古いシーケンスと一致するように新しいシーケンスに整数を追加して、新しいカスタムIDを調整しました。

于 2012-08-02T15:31:56.327 に答える