0

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テーブルのレジスタをブロックしていることです。そのため、誰かがその情報を更新したい場合は、レジスタが解放されるまで待機する必要があります。ただし、このテーブルの情報は更新されないため、これは小さな問題です。

他の選択肢はありますか?

ありがとう。

4

2 に答える 2

1

最後のtrxnがコミットされるまでトランザクションを開始できない厳密なフェーズロックの手法について説明しています。しかし、他のテクニックもあります。単純なフェーズロックを使用します。

before any write the trxn must perform the read.
the trxn must acquire the read or write lock before performing any change on data item.
no two trxn can take write lock on same item. 

タイムスタンプ順序付け(TO)手法を使用することもできます。

詳細については、このppt->同時実行制御を参照してください。

于 2013-01-22T19:59:02.697 に答える
1

Arpitの同時実行制御リンクが言ったように、との分離レベルは問題Serializableを回避することができPhantom Readます。したがって、これは実際にはSerializable、問題に対する分離レベルを備えたソリューションです。ただし、分離レベルが高いほど、同時実行性の効率は低下します。max intをグローバル静的プロパティに格納するのはどうですか?これはdbに基づいて初期化され、アプリケーションがダウンしたときにdbに保存されます。また、読み取りまたは更新時にグローバル静的プロパティにロックを適用する必要があります。

于 2013-01-23T03:14:38.823 に答える