丢失更新问题的发生情况:
假如A的工资是500;
B和C同时开始事务去修改A的工资;
B要从500修改为2000;
C要从500修改为300;
如果B先提交了事务,A工资被修改为2000;
C后提交事务,A工资被修改为300;
此时A的工资是300;
其实在B提交事务之后,A的工资已经被修改为2000了;
此时C修改A工资其实是从2000修改为300;
所以这时就出现了丢失更新问题;
下面说一下解决方法使用乐观锁
和上面相同的情况,乐观锁在提交事务的时候会比较当前数据版本和数据库的版本是否相同,
相同的话可以提交事务修改数据,相反则不能修改;而且成功修改数据之后同时会修改数据库的版本号(原版本号+1).
假如在B提交数据的时候,数据版本和数据库版本都为1,那么B可以提交事务并成功修改数据,数据库的版本号变为2;
C在后提交数据的时候,乐观锁检查数据版本为1,但是数据库的版本为2,此时C就不能够提交事务并修改数据,此时就解决了丢失更新问题
下面是具体操作
1、在数据库中创建version字段
2、在实体类中创建version属性,
添加@version和@TableField(fill = FieldFill.INSERT)注解