MVC Web アプリケーションを開発しています。
つまり、ビュー、モデル、ビュー モデルを作成しています。データベース プロバイダーとして linq-to-sql を使用し、カスタムUnit-of-Workパターンを実装しました。また、(私の実装では) 完全に見え、直接SQL
コードから完全に分離されたデータ ソース、リポジトリ、およびサービス パターンも実装しました。実際、単体テスト用に設計された任意のデータベースから、データベースに影響を与えずにインメモリ データ ソースを使用してアプリケーションをテストできました。
最終的に、1 つの問題に行き詰まります。クロス スレッド (またはクロス プロセス。私の知る限り、IISは 1 つの Web アプリで複数のアプリ ドメインを作成できるため) 操作に対する保護がありません。
たとえば、いくつかのレコードを含むテーブルがあります。そして、時々 Web リクエストが発生します (コントローラー内、サービス内、リポジトリ内) 列の最大数で SQL テーブルの行を選択しTicketId
、そのテーブルに別の行を挿入します(that column value + 1)
。
2 つ以上のスレッドまたはプロセスが同じことを行う場合、重複した値がデータベースに表示される可能性があります。しばらく前に、私の webapp が少し小さかったとき、私は直接 SQL コードを使用し、単純なUPDLOCK
SELECTステートメントでブロックを使用して、変更中のレコード (またはその他のもの) をロックし、他のすべてのデータベース クライアントが終了するまで待機するのを防ぎました。TransactionScope
これらすべてのパターンで、私は 1 つのことを忘れていました:
データベースのマルチアクセス保護の問題を実際に実装するにはどうすればよいですか?
直接の SQL コードなし。