乐观锁:
在面试过程中,我们经常会被问到乐观锁,悲观锁!其实非常简单!
- 乐观锁:顾名思义十分乐观,他总认为不会出现问题,无论干是什么都不去上锁!如果出现问题,再次更新值测试
- 悲观锁:顾名思义非常悲观,他总是认为总是出现问题,无论干什么都会先去上锁!再去操作!
MybatisPlus官网中关于乐观锁插件配置:https://mp.baomidou.com/guide/interceptor-optimistic-locker.html
乐观锁机制:
当要更新一条记录的时候,希望这条记录没有被别人更新
乐观锁实现方式:
- 取出记录时,获取当前version
- 更新时,带上这个version
- 执行更新时, set version = newVersion where version = oldVersion
- 如果version不对,就更新失败
以上是MybatisPlus官方对于乐观锁的描述,个人认为已经非常透彻!!!
通俗点来解释就是:
- 在对要进行操作的数据库数据操作前,首先对取出来数据获取一个version(版本号)。
- 程序对数据进行操作时,将这个version也进行更新。version+1,升级版本号
- 在数据库对数据执行更新操作时, 在数据修改前判断现在这条数据的version是否等于我取出来数据时的version(set version = new Version where version = oldVersion())
- 如果现在的version不等于我取出来的时候的version,就说明这条数据在我操作过程中,有人操作过,就更新失败,防止别人在我操作时,对这条数据进行了更新,但是我不知道,将更新后的数据覆盖,但是如果现在version等于执行前获取的version的话,就正常执行。
但是代码中是怎么实现的呢?
举个栗子:这个表就是MybatisPlus官网---快速开始的案例表:
现有一张
User
表,其表结构如下:
id name age version create_time update_time 1 Jone 18 test1@baomidou.com 1 2 Jack 20 test2@baomidou.com 1 3 Tom 28 test3@baomidou.com 1 4 Sandy 21 test4@baomidou.com 1 5 Billie 24 test5@baomidou.com 1 现在我要修改表中的数据:
UPDATE user SET name = jerry ,version = version +1 where name WHERE name = jerry and version = 1
1