MyBatisPlus 乐观锁使用总结
概要
主要适用场景:当要更新一条记录的时候,希望这条记录没有被别人更新,也就是说实现线程安全的数据更新
乐观锁实现方式:
取出记录时,获取当前version
更新时,带上这个version
执行更新时, set version = newVersion where version = oldVersion
如果version不对,就更新失败
使用事项
使用乐观锁之前一定要先查询拿到版本号
如果不拿到版本号直接更新,更新的数据将覆盖掉版本号为null
如果版本号为null,
再通过拿到版本号去更新数据,无论更新该条数据都不会更新版本号+1,一直为null。
流程调试1
如果一开始拿到的版本号是3,
但是更新的时候,别的线程先修改了版本号为5,
此条更新就失败,默认的更新如果成功会在执行这条更新语句的时候把版本号+1
总结
乐观锁的版本是在插入数据的时候自动填充的,更新的时候不做自动填充。
1.如果实体类配置了version该字段@TableField(fill = FieldFill.INSERT_UPDATE)自动填充,但是在handler insertfill() 和updatefill没有配置,在更新操作中
version不会自动填充
2.如果实体类配置了version该字段值只配置@TableField(fill = FieldFill.INSERT)时自动填充,但是在handler updatefill配置了该自动自动填充,在更新操作中
version会自动填充
所以为了避免影响最好是实体类配置该字段@TableField(fill = FieldFill.INSERT)操作的时候自动填充。并且只在insertfill handler中自动填充该字段