【问题标题】:optimal isolation level for specific applications特定应用的最佳隔离级别
【发布时间】:2013-01-20 18:05:45
【问题描述】:

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

对于以下场景,推荐的隔离级别是什么 -

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

场景 -

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

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

编辑 - 回应这里的评论是我的伪代码在实际代码中的样子。我没有代码,我只是想更好地理解这个场景。假设您有两张桌子“事件”,其中有两列 - “姓名,已预订座位”和一张桌子票,其中您有个人票的详细信息。

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

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

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

【问题讨论】:

  • 它现在甚至可以查询,给我们看一些真实的代码,你想把什么放到事务中
  • 您可以使用update SeatsBooked set SeatsBooked = case when SeatsBooked + @SeatsRequested &lt;= TotalSeats then SeatsBooked + @SeatsRequested else SeatsBooked end where Name = @Name 之类的语句在一个操作中处理测试和更新。 output 子句可以提供之前和之后的值。仍然需要适当的隔离级别。

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


【解决方案1】:

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

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

在原始 SQL 中,使用 WITH (UPDLOCK, HOLDLOCK) 会更优雅,但这不适用于 EF。

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

【讨论】:

  • +1 我写了一些关于其工作原理的文章:Entity framework and pessimistic concurrency
  • @LadislavMrnka - 很棒的文章。这消除了很多困惑。如果您写过关于表值函数的文章,请分享链接。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-02
  • 1970-01-01
  • 1970-01-01
  • 2013-01-25
  • 2010-12-04
  • 1970-01-01
相关资源
最近更新 更多