美好的一天,
我在C#.net 4.0框架上工作,数据库是Microsoft SQL Server 2008 R2。
有一个让用户进行礼品兑换的系统。当用户点击“兑换”按钮时,系统将:
如果库存小于0,则会提示错误消息告诉用户礼品已经完成,然后取消兑换流程。
在以下情况下会出现问题:
礼品A现在只有1个库存数量。
客户杰克点击2013-11-11 09:22:27.780
处的“兑换”按钮。
客户Jess点击2013-11-11 09:22:27.497
上的“兑换”按钮。
他们点击“兑换”按钮的不同时间仅为0.0283秒。
因此,也许不同的时间太短,两者都成功兑换礼品,因为在系统(第一个客户)更新gift_inventory表之前,系统(第二个客户)已经从库存中获取数据(礼品A) )因此,系统仍然允许第二个客户继续进行,因为库存仍然等于1.
我想出了解决这个问题的方法,其描述如下:
为gift_inventory表创建一个新列,名称为lock
,数据类型为Boolean
。当客户点击兑换按钮时,在系统检查礼品库存之前,将布尔值设置为true
。因此,如果第二个客户尝试访问礼品库存,并发现lock
= true
,那么系统将等待1秒然后再次尝试访问,直到{{1 }} = lock
,然后只访问并获取库存数据。
然而,我认为这是一个很好的解决方案。我认为这可能会导致数据库变慢。
有什么想法和建议吗?
答案 0 :(得分:1)
我认为你可以通过在事务中进行每次更新并在数据库中使用行锁定来实现这一目的。
在这里阅读更多内容:
<强>交易强> http://technet.microsoft.com/en-us/library/jj856598.aspx
<强>锁定强> http://technet.microsoft.com/en-us/library/aa213039(v=sql.80).aspx