<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
嗨,大家好,今天給想給大家分享一下關於Mybatis-plus 的 Service 層的一些方法的使用。今天沒有總結,因為都是一些API沒有什麼可以總結的,直接看著呼叫就可以了。
下面我們將介紹 @Version 註解的用法,以及每個屬性的實際意義和用法
在 MyBatis Plus 中,使用 @Version 實現樂觀鎖,該註解用於欄位上面
存在兩個執行緒 A 和 B,分別從資料庫讀取資料。執行後,執行緒 A 和 執行緒 B 的 version 均等於 1。如下圖
執行緒 A 處理完業務,提交資料。此時,資料庫中該記錄的 version 為 2。如下圖:
執行緒 B 也處理完業務了,提交資料。此時,資料庫中的 version 已經等於 2,而執行緒的 version 還是 1。程式給出錯誤資訊,不允許執行緒 B 運算元據。如下圖:
本範例將在前面用到的 user 表上面進行。在進行之前,現在 user 表中新增 version 欄位
ALTER TABLE `user` ADD COLUMN `version` int UNSIGNED NULL COMMENT '版本資訊';
:::info
定義 user 表的 JavaBean,程式碼如下:
import com.baomidou.mybatisplus.annotation.*; @TableName(value = "user") public class AnnotationUser5Bean { @TableId(value = "user_id", type = IdType.AUTO) private String userId; @TableField("name") private String name; @TableField("sex") private String sex; @TableField("age") private Integer age; @Version private int version; // 忽略 getter 和 setter 方法 }
新增 MyBatis Plus 的樂觀鎖外掛,該外掛會自動幫我們將 version 加一操作
注意,這裡和分頁操作一樣,需要進行設定,如果不設定,@Version是不會生效的
import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor paginationInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); // 樂觀鎖外掛 interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); return interceptor; } }
測試樂觀鎖程式碼,我們建立兩個執行緒 A 和 B 分別去修改使用者ID為 1 的使用者年齡,然後觀察年齡和version欄位的值
package com.hxstrive.mybatis_plus.simple_mapper.annotation; import com.hxstrive.mybatis_plus.mapper.AnnotationUser5Mapper; import com.hxstrive.mybatis_plus.model.AnnotationUser5Bean; import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import java.util.concurrent.CountDownLatch; @RunWith(SpringRunner.class) @SpringBootTest class AnnotationDemo5 { @Autowired private AnnotationUser5Mapper userMapper; @Test void contextLoads() throws Exception { // 重置資料 AnnotationUser5Bean user5Bean = new AnnotationUser5Bean(); user5Bean.setUserId(1); user5Bean.setAge(0); user5Bean.setVersion(0); userMapper.updateById(user5Bean); // 修改資料 for (int i = 0; i < 10; i++) { System.out.println("第 " + (i + 1) + " 次修改資料"); final CountDownLatch countDownLatch = new CountDownLatch(2); modifyUser(countDownLatch, "My-Thread-A", 1); modifyUser(countDownLatch, "My-Thread-B", 1); countDownLatch.await(); Thread.sleep(100L); } } private void modifyUser(final CountDownLatch countDownLatch, String threadName, int userId) { Thread t = new Thread(new Runnable() { @Override public void run() { try { String threadName = Thread.currentThread().getName(); try { AnnotationUser5Bean userBean = userMapper.selectById(userId); if (null == userBean) { return; } AnnotationUser5Bean newBean = new AnnotationUser5Bean(); newBean.setName(userBean.getName()); newBean.setSex(userBean.getSex()); newBean.setAge(userBean.getAge() + 1); newBean.setUserId(userBean.getUserId()); newBean.setVersion(userBean.getVersion()); int result = userMapper.updateById(newBean); System.out.println("result=" + result + " ==> " + userBean); } catch (Exception e) { System.err.println(threadName + " " + e.getMessage()); } } finally { countDownLatch.countDown(); } } }); t.setName(threadName); t.start(); } }
在執行上面程式碼之前,我們資料庫中的記錄值如下:
user_id | name | sex | age | version |
---|---|---|---|---|
1 | 測試 | 男 | 0 | 0 |
執行上面程式,資料庫記錄如下:
user_id | name | sex | age | version |
---|---|---|---|---|
1 | 測試 | 男 | 0 | 16 |
1.上面程式碼將執行10次迴圈操作,每次操作啟動兩個執行緒(執行緒 A 和 執行緒 B)去修改使用者資料。
2.如果資料沒有任何衝突,則使用者的年齡應該是 20。但是上面程式執行完成後年齡為 16
3.這就說明,線上程執行的時候,可能A 剛好修改了version,並沒有執行完,就到B執行緒了,就導致B執行緒修改失敗
以上就是詳解MybatisPlus中@Version註解的使用的詳細內容,更多關於MybatisPlus @Version註解的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45