大家好,
我正在C# .net 4.0框架上工作,数据库是MicrosoftSQLServer2008R2。
有一个系统,让用户做礼品赎回。当用户单击“赎回”按钮时,系统将:
如果库存小于0,则提示错误消息,通知用户礼品已经完成,然后取消赎回过程。
在以下情况下会出现问题:
礼物A现在只有一个数量的库存。
客户杰克点击“赎回”按钮在2013-11-11 09:22:27.780。客户Jess点击“赎回”按钮在2013-11-11 09:22:27.497。
他们点击“赎回”按钮的不同时间只有0.0283秒。
因此,可能不同的时间太短了,他们都成功地赎回了礼物,因为在系统(第一客户)更新gift_inventory表之前,系统(第二客户)已经从库存(Gift A)中获得了数据,因此,由于库存仍然等于1,所以系统仍然允许第二客户进行。
我已经想出了解决这个问题的方法,描述如下:为gift_inventory表创建一个新列,命名为lock,并使用数据类型Boolean。当客户单击“赎回”按钮,在系统检查礼品库存之前,将布尔值设置为true。因此,如果第二个客户尝试访问礼品库存,并发现lock = true,那么系统将等待1秒,然后再次尝试访问,直到lock = false,然后才访问和获取库存数据。
不过,我不认为这是一个好的解决办法。我认为这可能会导致数据库变得缓慢。
有什么想法和建议吗?
发布于 2014-01-23 07:04:11
我认为您可以通过在事务中执行每次更新并在数据库中使用行锁定来实现这一点。
点击此处阅读更多信息:
事务 http://technet.microsoft.com/en-us/library/jj856598.aspx
锁定 http://technet.microsoft.com/en-us/library/aa213039(v=sql.80).aspx
https://stackoverflow.com/questions/21301380
复制相似问题