特定应用的最佳隔离级别

时间:2013-01-20 18:05:45

标签: sql sql-server entity-framework transactionscope isolation-level

尝试更好地理解隔离级别 - 使用实体框架和SQL Server

以下方案的推荐隔离级别是什么 -

在线预订系统说机票或活动门票

情景 -

让我们假设事件的容量是100 - 伪代码如下

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

编辑 - 响应此处的评论是我的pseudeocode在实际代码中的样子。我没有代码,我只是想更好地理解这个场景。我们假设您有两个表“事件”,其中有两列 - “名称,seatbooked”和表格票据,您可以在其中获得单独的票证详细信息。

         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();
        }

在这种情况下,可以假设读取已提交或可重复读取会导致超量预订或丢失更新,因为两个事务可以竞争同一个席位。

推荐的方法是否可以序列化?

1 个答案:

答案 0 :(得分:2)

需要可重复读取,不需要序列化。可重复读取可确保更新将看到与先前选择相同的席位数。

但是,TransactionScope需要跨越整个逻辑工作单元。不仅仅是写作。

在原始SQL中,使用WITH (UPDLOCK, HOLDLOCK)会更优雅,但EF无法使用。

如果发生冲突,很容易发生死锁。重试整个逻辑事务或选择UPDLOCKUPDLOCK将完全避免这种僵局。