一、樂觀鎖
修改操作中的問題;樂觀鎖,瑣是用來解決併發問題的。
例如秒殺業務, 上了100個秒殺單子, 如果到了最後一個, 8個人一起買,會出現問題,
賣出第0號 -1號 -2號,小型併發解決方案:樂觀鎖。
二、Mybatis-Plus樂觀鎖實現步驟
Mybatis-Plus樂觀鎖實現步驟:
步驟一:資料庫表中新增鎖標記欄位
資料庫加欄位;user表 新增version欄位, 預設值設定為1
步驟二:實體類中新增對應欄位,並設定當前欄位為邏輯刪除標記欄位
public class User { private Long id; @Version private Integer version; }
步驟三:配置樂觀鎖攔截器實現鎖機制對應的動態SQL語句拼裝
需求:執行修改操作SQL拼接新增條件,開攔截器,像分頁攔截器一樣;
update set abc=1,version = version + 1 where version =1
@Configuration public class MpConfig { @Bean public MybatisPlusInterceptor mpInterceptor() { //1.定義Mp攔截器 MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor(); //2.新增具體的攔截器 mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor()); //3.新增樂觀鎖攔截器 mpInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); return mpInterceptor; } }
步驟四:使用樂觀鎖機制在修改前必須先獲取到對應資料的verion方可正常進行
//1.先透過要修改的資料id將當前資料查詢出來 User user = userDao.selectById(3L); //2.將要修改的屬性逐一設定進去 user.setName("Jock888"); userDao.updateById(user);
演示併發修改測試:
//1.先透過要修改的資料id將當前資料查詢出來 User user = userDao.selectById(3L); //version=3 User user2 = userDao.selectById(3L); //version=3 //2.將要修改的屬性逐一設定進去 user2.setName("Jock aaa"); userDao.updateById(user2); //version=>4 //2.將要修改的屬性逐一設定進去 user.setName("Jock bbb"); userDao.updateById(user); //verion=3,條件不成立,修改失敗
測試成功。