【web第二十一天】更新丢失问题
Day20-更新丢失问题
1.更新丢失问题的产生
两个并发的事务基于同一个查询结果进行修改,后提交的事务忽略了先提交的事务对数据库的影响,造成了先提交的事务对数据库的影响丢失,这个过程就叫做更新丢失。
案例1:easymall删除商品而未删除商品分类案例
案例2:重复充值案例
案例3:秒杀抢购案例
2.更新丢失解决方案:
将数据库隔离级别设置为Serializable就可以防止更新丢失问题的产生 - 但是很少这样解决,因为效率太低。
乐观锁和悲观锁:
乐观锁和悲观锁并不是数据库中真实存在的锁,而是两种解决方案的名字。
悲观锁:
悲观锁悲观的认为,每次查询都会造成更新丢失,所以在查询时,手动添加排它锁,排斥查询,从而解决更新丢失问题。
for update:在查询时手动增加排他锁。
例如:select * from xxx for update;
乐观锁:
乐观锁乐观的认为,每次查询都不会造成更新丢失,在修改时,检测更新丢失的发生来进行纠正。
例如:在秒杀抢购的时候,将更新库存代码改为如下代码:
如果查询多,而更新少,用乐观锁。
如果更新多,而查询少,用悲观锁。
3.EasyMall删除商品更新丢失问题解决
在ProdDaoImpl实现类中,findProdByCid方法中的sql语句后面加上for update即可: String sql = "select * from prod where cid = ? for update"; |