C#と.NET 4.0を使用して、次のケースがあります。
レジスターのグループをロードするときに、最初のユーザーがこのデータの操作を終了するまで、他のユーザーがこのグループに新しいレジスターを追加できないように制御する必要があります。これは、1人のユーザーが新しいレジスタを追加すると、そのデータは同じグループのすべてのレジスタの情報に依存するためです。
1つの簡単な例(愚かな例、実際のケースはもう少し複雑です)。私は整数であるグループを持っています。グループの最大整数を指すフィールドをデータレジスタに入れたい。
Group: (IDGRoup, Name, description...)
Data: (IDData, IDGroup, IDMaxData,...)
グループに新しいintを追加しようとする2人のユーザーがいる場合、プロセスは次のようになります。
1.-グループからすべての番号をロードします。
2.-最大数を検索します
3.-最大数のIDでIDMaxDataを設定します。
4.-情報を保存します。
問題は、2人のユーザーが同時にロードし、新しいintを追加しようとした場合、一方がグループの新しい最大数を追加すると、もう一方のユーザーが正しいIDを最大数に設定できないことです。彼は新しい最大数をロードしないためです。したがって、このユーザーはIDMaxDataを古い最大数に設定したため、情報は一貫していません。
データの一貫性を確保するにはどうすればよいですか?
トランザクションの使用を検討しています。
1.-IDが必要なグループのIDであるグループからレジスタをロードします。分離レベルがシリアル化可能なトランザクションを使用する場合、グループのレジスタをロードする瞬間に、2番目のユーザーはレジスタをロードできないためブロックされます。したがって、2番目のユーザーがグループテーブルのレジスタをロードできない場合、新しいレジスタを追加することはできません。
2.-最初のレジスタは、データテーブルからすべてのintをロードできます。2番目のユーザーは新しいレジスタを追加できない(待機している)ため、すべてのレジスタがあることを確認できます。そのため、正しい番号の保証でIDMaxDataを設定できます。
3.-データを保存して解放します。
彼が待っていた2番目のユーザーは、グループテーブルからレジスタをロードして、他のユーザーにブロックすることはできません。作業を行い、レジスタを解放します。
私の疑問は、これが良い解決策であるかどうかです。私が見ることができる唯一の問題は、Groupテーブルのレジスタをブロックしていることです。そのため、誰かがその情報を更新したい場合は、レジスタが解放されるまで待機する必要があります。ただし、このテーブルの情報は更新されないため、これは小さな問題です。
他の選択肢はありますか?
ありがとう。