select 檢索出的資料, for update 加上了一把鎖,其他的人是不能修改這個資料的,也不能在給這個資料加鎖。其他執行緒可以檢索出來,但是我在用 for update 再給這些資料加鎖是加不上的,因為這個鎖呢,已經被前一個執行緒給鎖住了。其他人是不能給它加鎖的,在加鎖的期間,其他人也不能修改這些資料。因為update 更新資料呢,是要獲取這些資料的鎖的
@Transactional(rollbackFor = Exception.class)
@RequestMapping("/database")
public String databaseLock () throws InterruptedException {
log.info("進入方法");
BusinessLock businessLock = businessLockMapper.getLock("demo");
if (ObjectUtils.isEmpty(businessLock)) {
log.info("分散式鎖找不到");
}
log.info("進入鎖");
Thread.sleep(6000);
log.info("方法執行完成");
return "方法執行完成";
}
mapper 裡面的sql
SELECT * FROM business_lock WHERE business_code = #{businessCode} FOR UPDATE
在程式碼中我們讓獲取到鎖的應用休眠6秒 ,8080 和 8088 差不多同一時間進入方法,
但是8080更早一些所有獲得到了鎖,而8088就在資料庫中阻塞,等待獲取鎖。
在16秒 8080獲得鎖等待6秒 22秒釋放鎖,這時 8088才拿到了鎖。說明在多個應用中鎖是有生效的。
教學原始碼+sql:https://apk-1257934361.cos.ap-guangzhou.myqcloud.com/lock/database-lock/database-lock.zip
為什麼要先關掉呢?你現在檢索出來以後或者for update 加了鎖,加了鎖以後它馬上事務呢就會自動的去提交,事務提交了。鎖就會自動釋放了。其他的對談,還會檢索出這條資料來