成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

@Transactional 與線程鎖:為何聯用會失效?

開發 前端
很多小伙伴使用Spring事務時,為了省事都喜歡使用@Transactional。但是@Transactional配合鎖,會導致一些預期之外的問題!

很多小伙伴使用Spring事務時,為了省事都喜歡使用@Transactional。但是@Transactional配合鎖,會導致一些預期之外的問題!

在此舉例說明。

數據準備

我們將在該表中,實現level數據遞減的并發操作。

圖片圖片

Controller中,簡單模擬10個線程各自執行10次:

圖片圖片

@Transactional是如何導致鎖失效的

1、不加鎖

// service代碼
public void test() {
    // 簡單的select + update 模擬業務場景
    Model model = mapper.choseOne("99");

 // 實現 level -- 操作
    Model updater = new Model();
    updater.setId("99");
    updater.setLevel(model.getLevel() - 1);
    mapper.updateOne(updater);
}

執行結果:我們發現,level只扣減了26,說明存在并發問題!

圖片圖片

2、使用鎖

// service代碼
private Lock lock = new ReentrantLock();

public void test() {
try {
     //加鎖
     lock.lock();
     // 簡單的select + update 模擬業務場景
     Model model = mapper.choseOne("99");

// 實現 level -- 操作
     Model updater = new Model();
     updater.setId("99");
     updater.setLevel(model.getLevel() - 1);
     mapper.updateOne(updater);
 } finally {
       lock.unlock(); // 解鎖
    }
}

執行結果:我們發現,使用鎖是可以控制并發問題。

圖片圖片

3、使用鎖+@Transactional

// service代碼
private Lock lock = new ReentrantLock();

@Transactional
public void test() {
try {
     //加鎖
     lock.lock();
     // 簡單的select + update 模擬業務場景
     Model model = mapper.choseOne("99");

// 實現 level -- 操作
     Model updater = new Model();
     updater.setId("99");
     updater.setLevel(model.getLevel() - 1);
     mapper.updateOne(updater);
 } finally {
       lock.unlock(); // 解鎖
    }
}

執行結果:我們發現,level只扣減了86!用了@Transactional之后,鎖怎么就失效了呢!

圖片圖片

4、問題分析

我們都知道,@Transactional是通過使用AOP,在目標方法執行前后進行事務的開啟和提交。所以,Lock鎖住的代碼,其實并沒有包含住一整個事務!

通過下面的圖理解一下:

圖片圖片

當線程A將level設置為99時,此時鎖已經釋放了,但是事務還沒提交!!線程B此時可以獲取到鎖并進行查詢,查詢出來的level還是線程A修改之前的100,所以出現了并發問題。

解決方案

1、@Transactional單獨一個方法

private Lock lock = new ReentrantLock();
@Transactional
public void test1() {
    // 簡單的select + update 模擬業務場景
    Model model = mapper.choseOne("99");

// 實現 level -- 操作
    Model updater = new Model();
    updater.setId("99");
    updater.setLevel(model.getLevel() - 1);
    mapper.updateOne(updater);
}

@Autowired
@Lazy
private CommonService commonService;
public void test() {
    try {
        // 加鎖
        lock.lock();
        // 自己注入自己,以使用到其代理類
        commonService.test1();
    } finally {
        lock.unlock(); // 解鎖
    }
}

執行結果:沒有并發問題出現!

圖片圖片

或者直接在controller層加鎖,也是一樣的道理。

2、使用編程式事務

// service代碼
private Lock lock = new ReentrantLock();
@Autowired
private PlatformTransactionManager transactionManager;
public void test() {
try {
     //加鎖
     lock.lock();
     // 編程式事務
        TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
        
     // 簡單的select + update 模擬業務場景
     Model model = mapper.choseOne("99");

// 實現 level -- 操作
     Model updater = new Model();
     updater.setId("99");
     updater.setLevel(model.getLevel() - 1);
     mapper.updateOne(updater);
     
// 在鎖中提交
        transactionManager.commit(status);
 } finally {
       lock.unlock(); // 解鎖
    }
}

執行結果:我們發現,將整個事務都鎖住,就沒問題了!


圖片圖片

責任編輯:武曉燕 來源: 一安未來
相關推薦

2024-08-23 09:46:46

2022-09-20 22:27:08

事務失效public 修飾

2022-09-14 19:50:22

事務場景流程

2023-09-27 16:22:51

SpringMySQL原子性

2023-09-28 09:07:54

注解失效場景

2017-05-08 11:46:15

Java多線程

2017-05-31 14:03:07

Java多線程內置鎖與顯示鎖

2022-08-09 09:34:32

Spring開發

2022-08-08 17:38:45

Spring策略事務

2022-04-13 20:53:15

Spring事務管理

2021-04-14 15:17:08

Transaction代碼語言

2009-02-23 21:28:00

LinuxDrupal管理平臺

2015-07-20 09:35:57

開源商業模式

2014-01-23 09:24:35

Windows 9

2024-10-14 16:25:59

C#線程鎖代碼

2020-08-26 08:59:58

Linux線程互斥鎖

2018-08-21 09:49:12

智慧城市

2023-09-08 08:52:12

Spring注解事務

2020-04-14 13:32:56

@Transacti失效場景

2023-08-29 10:51:44

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 午夜tv免费观看 | 亚洲国产精品一区二区三区 | 99国产精品99久久久久久 | 日本成人免费网站 | 黄色大片免费播放 | 久久高清亚洲 | 欧美 日韩 亚洲91麻豆精品 | 女同久久另类99精品国产 | 日韩视频一区在线观看 | 亚洲综合色 | av一区二区三区在线观看 | 中文字幕乱码一区二区三区 | 黄色一级片在线播放 | 亚洲一区二区三区在线 | 亚洲欧美一区二区三区国产精品 | 337p日本欧洲亚洲大胆 | 三区在线观看 | 日本又色又爽又黄又高潮 | 免费中文字幕 | 亚洲精品 在线播放 | 国产成人精品一区二区三 | 天堂久久av | 国产精品久久二区 | 免费骚视频 | 你懂的av| 日韩三级电影在线看 | 久久久久久国产精品免费免费男同 | 欧洲性生活视频 | 国色天香成人网 | 99久久99| 国产欧美精品一区二区三区 | 精品国产一区二区三区久久久蜜月 | 在线观看www视频 | 国产精品久久久久久久久久免费 | 美女久久久久 | 日韩中文字幕区 | 国产精品视频一二三区 | 午夜av影院| 亚洲网站在线播放 | 日韩在线免费视频 | 国产精彩视频在线观看 |