并发之非事物数据一致性

故事:某影院的优惠期结束了 现在后台要修改价格返回原价 优惠价=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=失败

方案二(加行级锁):

在管理员读取数据并进行修改时对整行数据加锁,释放后才允许购买



最后总结:

把用户视为上帝用方案一,把用户视为草芥用方案二,世界上没有最好的办法,只有最适合的办法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值