0

分離レベルをよりよく理解しようとする - エンティティ フレームワークと SQL サーバーを使用する

次のシナリオで推奨される分離レベルは?

航空券やイベント チケットなどのオンライン予約システム

シナリオ -

イベントの容量が 100 であると仮定しましょう。擬似コードは次のとおりです。

   Begin transaction
   If SeatCount < 100 
   SeatCount  = SeatCount + 1
   End transaction

編集- ここでのコメントに応えて、私の疑似コードが実際のコードでどのように見えるかを示します。私はコードを持っていません。シナリオをよりよく理解しようとしています。「イベント」という 2 つのテーブルがあり、そこに「名前、座席指定」という 2 つの列があり、個々のチケットの詳細があるテーブル チケットがあるとします。

         bool tSuccess = false;
        //this transactionscope resolves to serializable 
        using (TransactionScope transaction = new TransactionScope()            
        {                
            try{
            if(objectcontext.event.SeatsBooked < 100)
            {
                objectcontext.event.SeatsBooked = objectcontext.event.SeatsBooked + 1;
                ticket newTicket = new ticket{
                };
                objectcontext.tickets.AddObject(newTicket);
                objectcontext.SaveChanges();
            }
           }
           catch(Exception e)
           {
              //log and return 
           }
        }
        if (tSuccess)
        {
            bd.AcceptAllChanges();
        }

このシナリオでは、2 つのトランザクションが同じシートをめぐって競合する可能性があるため、コミットされた読み取りまたは反復可能な読み取りがオーバーブッキングまたは更新の損失につながると想定しても問題ありません。

シリアライズ可能にするための推奨されるアプローチはありますか?

4

1 に答える 1

2

反復可能な読み取りが必要です。シリアライズ可能は必要ありません。反復可能な読み取りにより、更新では、前の選択と同じシート数が表示されます。

TransactionScopeただし、作業の論理単位全体にまたがる必要があります。書き込みだけではありません。

生の SQL ではよりエレガントに使用WITH (UPDLOCK, HOLDLOCK)できますが、EF では使用できません。

競合が発生すると、デッドロックが発生しやすくなります。論理トランザクション全体を再試行するか、 で選択してUPDLOCKください。UPDLOCKそのデッドロックを完全に回避します。

于 2013-01-20T20:26:59.080 に答える