Webサイトで一般的な操作が実行されているとしましょう。なぜビジネスロジックですか?
- チェック条件操作が
- (ユーザー権利、いくつかのオブジェクトの一貫性、関係および他のもの)は許可されているかどうかを更新DBレコード
- レポート:ユーザーがボタンを押すと、アプリケーションがすべき後
これは数多くの書籍で書かれているように、ビジネスロジック層の懸念事項です。 実際には、まずDBからデータを読み込み、DBにデータを書き込みます。また、チェック中に他のユーザー/プロセスによってデータが変更された場合、無効な結果がデータベースに格納されます。問題のようなものはよく知られているはずですが、私はまだこのための良い解決策を見つけることができません。
質問は次のとおりです。なぜ、保守業務トランザクションの機会のないビジネスロジック層が必要なのでしょうか?
おそらく、あなたはTransactionScopeと言います。さて、どのように外部プロセスによるデータの変更からデータを読み取れないようにしますか?ビジネス層からUPDLOCKする方法は?可能であれば、ストアドプロシージャでトランザクションを行うよりもずっと高価にならないでしょうか?
ロジックの一部をDBに持ち込む方法はありません。両方の部品#1と#2が同じトランザクションで実装されなければならず、さらに、更新が完了するまで読み取りデータをロックする必要があります。
アイデア?
通常、他の誰かがデータを並行して変更する可能性が小さい場合は、* optimistic locking *を使用します。一方、あなたの 'UPDLOCK'は*悲観的ロック*です。このトピックに関する多くのドキュメントがあります。 –
チャンスが大きいです。ユーザーがいくつかの主題に投票するWebアプリケーションを想像してみてください。各投票ボタンを押すたびにvotes = votes + 1にする必要があります。私は現在の投票数100を読んで、チェックし、その間に500人の他の人が投票したので、すでに間違っている101の値を書きます。 – LINQ2Vodka
それはUPDLOCKでもうまくいかないでしょう。 UPDLOCKを使用すると500人が投票できなくなります。 –