MybatisPlus实现乐观锁
生活随笔
收集整理的這篇文章主要介紹了
MybatisPlus实现乐观锁
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
樂觀鎖
主要適用場景:當要更新一條記錄的時候,希望這條記錄沒有被別人更新,也就是說實現線程安全的數據更新
樂觀鎖實現方式:
- 取出記錄時,獲取當前version
- 更新時,帶上這個version
- 執行更新時, set version = newVersion where version = oldVersion
- 如果version不對,就更新失敗
?
(1)數據庫中添加version字段
ALTER TABLE `user` ADD COLUMN `version` INT (2)實體類添加version字段 并添加 @Version 注解 @Version @TableField(fill = FieldFill.INSERT) private Integer version;(3)元對象處理器接口添加version的insert默認值
@Override public void insertFill(MetaObject metaObject) {......this.setFieldValByName("version", 1, metaObject); }特別說明:
- 支持的數據類型只有 int,Integer,long,Long,Date,Timestamp,LocalDateTime
- 整數類型下?newVersion = oldVersion + 1
- newVersion?會回寫到?entity?中
- 僅支持?updateById(id)?與?update(entity, wrapper)?方法
- 在?update(entity, wrapper)?方法下,?wrapper?不能復用!!!
(5)測試樂觀鎖可以修改成功
測試后分析打印的sql語句,將version的數值進行了加1操作
//測試樂觀鎖 @Test public void testOptimisticLocker() {//根據id查詢數據User user = userMapper.selectById(1231115382920916994L);//進行修改user.setAge(200);userMapper.updateById(user); }(5)測試樂觀鎖修改失敗
/*** 測試樂觀鎖插件 失敗*/ @Test public void testOptimisticLockerFail() {//查詢User user = userMapper.selectById(1L);//修改數據user.setName("Helen Yao1");user.setEmail("helen@qq.com1");//模擬取出數據后,數據庫中version實際數據比取出的值大,即已被其它線程修改并更新了versionuser.setVersion(user.getVersion() - 1);//執行更新userMapper.updateById(user);}?
總結
以上是生活随笔為你收集整理的MybatisPlus实现乐观锁的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MybatisPlus实现自动填充
- 下一篇: MybatisPlus实现分页