本帖最后由 妄想社成员 于 2024-1-10 20:48 编辑
1.先定义脏数据(来源baidu百科):
当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是脏数据。
2.定义化用到更新库存的业务:
多个用户同时执行修改库存表中某一商品的库存数量,A用户读取到100,要出库10,新库存数为90,但还未保存更新后的数据,B此时读这一商品库存,为100,出库10,新库存数为90,A更新库存数为90,B更新库存数为90,其中B读到的100数据便为脏数据,这也是并发修改库存数量遇到的问题。
3.mysql5.7 的默认隔离策略为 可重复读
即并发事务可以同时读到数据
4.产生问题的原因:
可重复读策略禁止修改数据,但是可以并发读数据,且该策略在事务运行中生效的机制是遇写入操作时才会锁住对应的行数据,比如(A用户读取到100,要出库10,新库存数为90,但还未保存更新后的数据,B此时读这一商品库存,为100(本应该读到A更新完后的数据:90),出库10,新库存数为90(本应该为80))
5.解决方案:
在事务命令下对可能进行并发读写的库存记录进行一些更新操作,进而在读库存数之前就触发隔离策略的数据锁操作,这样之后读就不会读到脏数据,如下图
可能有说得不对、理解得不对的地方,劳烦佬们指点
|
|