91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MyBatis-Plus通過version機制實現樂觀鎖的思路是怎樣的

發布時間:2021-09-26 10:02:58 來源:億速云 閱讀:350 作者:柒染 欄目:開發技術

本篇文章給大家分享的是有關MyBatis-Plus通過version機制實現樂觀鎖的思路是怎樣的,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

MyBatis-Plus是通過version機制實現樂觀鎖的。

大致思路:

  • 取出記錄,攜帶記錄的當前version

  • 更新記錄的時候,比較記錄當前的version是否有改變;

  • 如果version未改變,則更新記錄,并更新version,一般值+1

  • 如果version改變了,則不更新記錄。

version機制的核心思想就是,假設發生并發沖突的幾率很低,只有當更新數據的時候采取檢查是否有沖突,而判斷是否有沖突的依據就是version的值是否被改變了。

配置

MyBatis-Plus中配置樂觀鎖分兩步:

  • 實例化OptimisticLockerInnerInterceptor,并添加到MyBatis-Plus的攔截器鏈中;

  • 定義version字段,并在Entity中使用@Version注解注釋version字段。

說明:

支持的數據類型只有: intIntegerlongLongDateTimestampLocalDateTime

整數類型下 newVersion = oldVersion + 1

newVersion 會回寫到 entity 中;

僅支持 updateById(id)update(entity, wrapper) 方法;

update(entity, wrapper) 方法下, wrapper 不能復用!!!

配置如下:

首先,實例化OptimisticLockerInnerInterceptor,并添加到攔截器鏈中:

@Configuration
public class MyBatisPlusConfig {

    /**
     * 插件配置
     *
     * @return
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 向MyBatis-Plus的過濾器鏈中添加分頁攔截器,需要設置數據庫類型(主要用于分頁方言)
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        // 添加樂觀鎖攔截器
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return interceptor;
    }
}

然后,使用@Version注解:

@Data
@TableName("tb_user")
public class UserEntity {
    private Long id;
    private String name;
    private Integer age;
    private String email;

    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private Date createTime;

    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

    @TableLogic(value = "0", delval = "-1")
    @TableField(value = "delete_flag", fill = FieldFill.INSERT)
    private Integer deleteFlag;

    @Version
    @TableField(value = "version", fill = FieldFill.INSERT)
    private Integer version;
}

配置insert時候,version默認值賦1

/**
 * 自動填充字段值得配置
 */
@Component
public class AutoFillFieldValueConfig implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject, "createTime", Date.class, new Date());
        this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());
        this.strictInsertFill(metaObject, "deleteFlag", Integer.class, 0);
        this.strictInsertFill(metaObject, "version", Integer.class, 1);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());
    }
}

測試一下

1.測試新增記錄

首先新增一條數據:

@Test
    public void testVersionInsert() {
        // 插入一個新的用戶
        UserEntity newUser = new UserEntity();
        newUser.setId(12L);
        newUser.setName("Kelly");
        newUser.setAge(28);
        newUser.setEmail("Kelly@163.com");
        userMapper.insert(newUser);
    }

控制臺日志:

==>  Preparing: INSERT INTO tb_user ( id, name, age, email, create_time, update_time, delete_flag, version ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ? )
==> Parameters: 12(Long), Kelly(String), 28(Integer), Kelly@163.com(String), 2021-09-25 00:14:23.894(Timestamp), 2021-09-25 00:14:23.896(Timestamp), 0(Integer), 1(Integer)
<==    Updates: 1

數據庫數據:

MyBatis-Plus通過version機制實現樂觀鎖的思路是怎樣的

可以看到,新增記錄時,version默認賦值為1

2.測試更新記錄

下面,來測試一下更新記錄,看看version的變化。

   @Test
    public void testVersionUpdate() {
        // 查詢用戶記錄
        UserEntity updateUser = userMapper.selectById(12L);
        // 更新用戶記錄
        updateUser.setId(12L);
        updateUser.setAge(30);
        userMapper.updateById(updateUser);
    }

注意:這里有一個坑!

一定要先查詢出這條數據,再更新,樂觀鎖才會生效!!!

控制臺打印的日志:

==>  Preparing: SELECT id,name,age,email,create_time,update_time,delete_flag,version FROM tb_user WHERE id=? AND delete_flag=0
==> Parameters: 12(Long)
<==    Columns: id, name, age, email, create_time, update_time, delete_flag, version
<==        Row: 12, Kelly, 30, Kelly@163.com, 2021-09-25 00:14:24, 2021-09-25 00:20:24, 0, 1
<==      Total: 1

......

==>  Preparing: UPDATE tb_user SET name=?, age=?, email=?, create_time=?, update_time=?, version=? WHERE id=? AND version=? AND delete_flag=0
==> Parameters: Kelly(String), 30(Integer), Kelly@163.com(String), 2021-09-25 00:14:24.0(Timestamp), 2021-09-25 00:20:24.0(Timestamp), 2(Integer), 12(Long), 1(Integer)
<==    Updates: 1

數據庫數據:

MyBatis-Plus通過version機制實現樂觀鎖的思路是怎樣的

可以看到,version字段由原來的1,更新為2

以上就是MyBatis-Plus通過version機制實現樂觀鎖的思路是怎樣的,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

吐鲁番市| 南澳县| 寻乌县| 易门县| 石阡县| 浪卡子县| 团风县| 金山区| 民和| 广东省| 克东县| 封开县| 林西县| 谷城县| 梁河县| 太保市| 积石山| 慈利县| 渑池县| 修水县| 嘉禾县| 塔河县| 柏乡县| 天祝| 遵化市| 赤城县| 灵寿县| 永德县| 楚雄市| 新兴县| 乌鲁木齐县| 长海县| 渝北区| 娱乐| 南华县| 磴口县| 九龙县| 大厂| 蒙城县| 罗甸县| 枣强县|