超卖问题
2018-10-04 本文已影响0人
越过_1b61
1.当库存还剩一个时,同一个数据AB同时来访问时就会超卖问题。
数据库深层是:同一个数据,对于数据库来说加了隐式锁是不能同时写的,但是A写的时候,B却可以读。
解决办法:
可以对读操作加上显式锁,比如Select...for update.但是这样会产生效率问题,所以可以设置一个值,当少于这个值就会加锁。
可以加上一个乐观锁,更新库存时就要更新versionid,若两个用户同时使得versionid=3并提交就会使一个事务必然回滚。
数据库表设计:task有三个字段,有id,value,version
先读task表的数据,得到的value为versionvalue。
每次更新的时候,需要这样:update task set value=newvalue,version=versionValue+1 where version=versionValue;