日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

mybatisplus 结果_springboot整合mybatisPlus 乐观锁的实现

發布時間:2025/4/5 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mybatisplus 结果_springboot整合mybatisPlus 乐观锁的实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1:樂觀鎖

1.1:樂觀鎖簡介

樂觀鎖:總是假設最好的情況,在讀取數據的使用不會發生并發問題,但在更新的時候比較原數據是否被其他線程發生了改變。主要通過通過版本號機制或CAS算法實現,適用于讀多寫少的應用場景。

版本號機制:在數據庫表中加一個版本號version字段,表示數據被修改的次數,在修改數據前先讀取該表中的版本號字段,在修改的使用對比是否是自己讀取出來的版本號如果是則進行更新操作并版本號(version)加1如果不是則重新執行進行更新操作直到更新成功為止。

CAS:compare and swap 顧名思義就是比較與替換。CAS 操作包含三個操作數 —— 內存位置(V)、預期原值(A)和新值(B)。
內存位置的值是否與預期原值一樣如果一樣則用新值更新,如果不則重試。CAS算法實現會導致ABA問題的產生。

ABA問題:A線程某一時刻獲取內存位置的值為10,與其原值也為10,在這個過程中假設B線程對內存位置的值進行了修改,修改我為12,下一毫米又對內存中的值進行了修改,修改為10。這是A線程把值修改為13修改成功。這就是ABA問題。通俗易懂的來講就是:你大爺是你大爺,你大媽已經不是你大媽了。樂觀鎖通常使用版本號機制來避免ABA問題。

1.2:樂觀鎖的例子

未使用樂觀鎖(實現存錢取錢)

A操作人員B操作人員
查詢余額(100¥)查詢余額(100¥)
存入10¥(100¥+10¥)喝咖啡中
喝咖啡中取出10¥(100¥-10¥)
查詢余額 (90¥)喝咖啡中
查詢余額 (90¥)查詢余額 (90¥)

以使用樂觀鎖(實現存錢取錢)

A操作人員B操作人員
查詢余額(100¥)version=1查詢余額(100¥)version=1
存入10¥(100¥+10¥)把查詢余額中的version進行對比匹配version+1充值成功喝咖啡中
喝咖啡中取出10¥(100¥-10¥)把查詢余額中的version進行對比,結果不匹配 ,取出不成功,重新進行取錢操作,查詢余額(110¥)version=2,把查詢余額中的version進行對比匹配version+1取出成功 (110¥-10¥)
查詢余額 (100¥)喝咖啡中
查詢余額 (100¥)查詢余額 (100¥)

2:springboot整合mybatisPlus 樂觀鎖插件

本章會設計到 springboot整合mybatisPlus整合使用,springboot整合swagger2整合使用,需要的可以看我其他的博文

2.1 插件配置

package cloud.xingzhe.springbootmybatisplus;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
@MapperScan("cloud.xingzhe.springbootmybatisplus.mapper")
public class SpringbootMybatisPlusApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootMybatisPlusApplication.class, args);
}
/**
*樂觀鎖插件
*/
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
}

2.2 注解實體字段 @Version 必須要!

package cloud.xingzhe.springbootmybatisplus.model;
import java.io.Serializable;
import com.baomidou.mybatisplus.annotation.Version;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import javax.validation.Valid;

/**
* @author 行者
* @since 2020-05-08
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="Bank對象", description="")
public class Bank implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
@ApiModelProperty(value = "余額")
private Integer amount;
@ApiModelProperty(value = "版本號")
@Version
private Integer version;
@ApiModelProperty(value = "用戶id")
private Integer userId;
}

特別說明:

支持的數據類型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime
整數類型下 newVersion = oldVersion + 1
newVersion 會回寫到 entity 中
僅支持 updateById(id) 與 update(entity, wrapper) 方法
在 update(entity, wrapper) 方法下, wrapper 不能復用!!!

3:代碼演示

3.1:數據庫表

CREATE TABLE?bank?(id?int(11) NOT NULL,amount?int(10) NULL DEFAULT NULL COMMENT ‘余額’,version?int(5) NULL DEFAULT NULL COMMENT ‘版本號’,user_id?int(11) NULL DEFAULT NULL COMMENT ‘用戶id’,
PRIMARY KEY (id) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

INSERT INTO?bank?VALUES (1, 100, 0, 2);

3.2:測試并發接口

package cloud.xingzhe.springbootmybatisplus.controller;
import cloud.xingzhe.springbootmybatisplus.model.Bank;
import cloud.xingzhe.springbootmybatisplus.service.IBankService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

/**
*


* 前端控制器
*


* @author 行者
* @since 2020-05-08
*/
@Api(tags = "銀行管理")
@RestController
@RequestMapping("/sys/bank")
public class BankController {
@Autowired
private IBankService bankService;
@ApiOperation(value="存取測試樂觀鎖")
@RequestMapping(value = "/access",method = RequestMethod.GET)
@ResponseBody
public String access(String userId,Integer money) throws InterruptedException {
QueryWrapper<Bank> queryWrapper=new QueryWrapper<>();
queryWrapper.eq("user_id", userId);
Bank bank = bankService.getOne(queryWrapper);
Integer amount= bank.getAmount();
bank.setAmount(amount+money);
Thread.sleep(5000);
boolean b = bankService.updateById(bank);
if (b){
return "更新成功";
}
return "更新失敗,余額已被其他操作人員修改,請重試";
}
}

3.2:接口訪問截圖


注意:開兩個swagger2 頁面進行測試 ,測試的money的參數最好不一樣 (有些瀏覽器接口和參數完全一樣會等待接口數據放回才再次請求)
數據庫中的version字段會每次都會加一 可以觀察看看

5:相關連接:

源碼地址:https://github.com/xingzhewenzi/springboot-examples.git
用到的博文地址:
springboot整合mybatis-plus(1) mybatis魂斗羅兄弟p2 實現單表curd零sql
springboot整合mybatisPlus代碼生成器 快速生成controller service mapper
springboog整合swagger2 實現便捷高效的接口文檔

總結

以上是生活随笔為你收集整理的mybatisplus 结果_springboot整合mybatisPlus 乐观锁的实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩在线网址 | 午夜日韩在线 | 午夜成人免费电影 | 国产成人愉拍精品久久 | 深夜成人在线 | 动漫美女靠逼 | 夜夜骚av | 凹凸精品一区二区三区 | 爱福利视频一区二区 | 激情视频在线观看免费 | 日本三级视频在线 | 久久成人国产精品入口 | 亚洲一区二区三区四区在线观看 | 少女情窦初开的第4集在线观看 | 女女互慰吃奶互揉调教捆绑 | 亚洲成人av一区 | 亚洲一区二区三区四区视频 | 激情小视频| 男生操女生免费网站 | 国产午夜精品久久久 | 精品无码一区二区三区爱欲 | 久久久久精 | 小泽玛丽亚在线观看 | 在线观看av不卡 | 中文字幕一区二区三区人妻四季 | 久草加勒比 | 国产一区二区在线观看视频 | 黄色片日韩 | 精品在线免费观看 | 色哟哟在线观看视频 | 精品久久国产 | 黄金网站在线观看 | 欧美一级淫 | 久久久久成人网 | 在哪里可以看毛片 | 田中瞳av | 丁香婷婷综合激情 | 亚洲色图图 | 国产对白刺激视频 | 久久久精品人妻一区二区三区四 | 欧美激情视频在线观看 | 少妇献身老头系列 | 18无套直看片红桃 | 麻豆精品国产传媒av绿帽社 | 精品久久久久久久久久岛国gif | 天堂а√在线中文在线 | 精品无码国产一区二区三区av | 色爱区综合 | 熟女人妇 成熟妇女系列视频 | 好吊一二三区 | 亚洲一区二区三区麻豆 | 丁香婷婷成人 | av中文字幕不卡 | 又黄又高潮的视频 | h片在线免费看 | 国产女教师一区二区三区 | 在线观看日本一区 | 亚洲精品网站在线 | 一本色道久久综合亚洲精品酒店 | 国产精品久久久久久久一区二区 | 色爱区综合 | 超碰在线成人 | 色欲一区二区三区精品a片 在线观看黄网站 | 久久久啊啊啊 | 欧美图片一区 | 岛国精品在线播放 | 99资源站| 色二区 | 杨幂毛片午夜性生毛片 | 欧美午夜不卡 | 日本网站在线免费观看 | 色屁屁ts人妖系列二区 | 免费看黄色小视频 | 不用播放器看av | h狠狠躁死你h高h | 黄色网页观看 | 精品人妻aV中文字幕乱码色欲 | 91视频区 | 啪啪一区二区 | 天天爽天天做 | 国内精品视频在线播放 | 午夜视频在线免费看 | 天天草综合 | 怡红院av在线 | 日韩av综合网| 91香蕉视频官网 | 麻豆免费下载 | 国产古装艳史毛片hd | 最新av电影网站 | 另类ts人妖一区二区三区 | 日本黄色一级视频 | 麻豆免费在线 | 福利视频第一页 | 日韩综合网站 | 欧美不卡视频在线观看 | 美女黄色片网站 | 日本黄色小片 | 男人的天堂一级片 | 朴麦妮原版视频高清资源 |