故事:某影院的优惠期结束了 现在后台要修改价格返回原价 优惠价=40,原价=50,如图:
但是在你修改完成提交时中间有十张票被买了出去,(当前票数=80-10,你修改价格提交的票数=80 )
你修改完成后就会有多卖出十张价格=40的票 (操作员不是程序员,不知道这个套路,也不知道程序员留下的bug)
之后发发生的事情可想而知,为了解决非事物的数据一致性,现有如下两个解决方案
方案一(加数据版本字段):
在数据库加上一个数据版本号字段,每次数据的变化版本号也跟着产生变化,假如在管理员修改票价到
原票价的时候数据版本是1.0,卖出去十张后数据版本为2.0 ,用此sql现实防止管理员提交非最新数据:
update movie set number = 80 ,price=50,version=1.0+0.1 where id=x and version = 1.0;
可见管理员提交后数据库的版本已跟他提交的版本显然不一致,修改失败,只能再来一次 通过preparedStatment.exceteUpdate()方法返回值判断数据修改是否成功 1=成功 0=失败
方案二(加行级锁):
在管理员读取数据并进行修改时对整行数据加锁,释放后才允许购买
最后总结:
把用户视为上帝用方案一,把用户视为草芥用方案二,世界上没有最好的办法,只有最适合的办法