【发布时间】: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 <= TotalSeats then SeatsBooked + @SeatsRequested else SeatsBooked end where Name = @Name之类的语句在一个操作中处理测试和更新。output子句可以提供之前和之后的值。仍然需要适当的隔离级别。
标签: sql sql-server entity-framework transactionscope isolation-level