定義
是指在讀取一行資料時,記下它的版本號、最近修改的時間戳或校驗和,然后,你可以在修改記錄之前檢查版本有沒有發生變化,
適用場景
適用于讀多寫少的場景,樂觀鎖相信事務之間的資料競爭概率較小,因此盡可能地直接做下去,直到提交的時候才去鎖定,
實作方式
- 取出記錄時,獲取當前 version
- 執行更新時,帶上這個 version,如 update table_name set version = 2 where id = 1 and version = 1;
- 如果 version 不對,則更新失敗
Mybatis-Plus 實作樂觀鎖
首先資料庫表添加 version 欄位用于記錄版本,注意默認值不能為空,否則樂觀鎖將失效(Mybatis-Plus 支持的樂觀鎖資料型別包括:int,Integer,long,Long,Date,Timestamp,LocalDateTime)
ALTER TABLE `iob_enterprise`
ADD COLUMN `version` int(4) NULL DEFAULT 0 COMMENT '樂觀鎖';
樂觀鎖插件配置
@Configuration
public class MybatisPlusOptLockerConfig {
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
}
在資料庫表映射物件中添加對應 version 屬性,并加上生效注解
@Version
private Integer version;
目前 Mybatis-Plus 樂觀鎖僅支持 updateById(id) 與 update(entity, wrapper) 方法
Boolean updateFlag = false;
while (!updateFlag) {
if (getById(id) == null) {
throw new ServiceException("當前資料不存在");
}
updateFlag = updateById(enterprisePO);
}
缺點
回圈等待占用 CPU 資源,不適合高并發場景
更好的解決方案:ZooKeeper、Redisson 等
本文來自博客園,作者:這個殺手冷死了,轉載請注明原文鏈接:https://www.cnblogs.com/pandacode/p/16162482.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/458504.html
標籤:其他
