摘要:最近開(kāi)發(fā),有地方需要用到多線程,每個(gè)線程里面處理多個(gè)方法,過(guò)程中遇到了一個(gè)問(wèn)題,我們使用平時(shí)的注解,就是當(dāng)前一個(gè)方法執(zhí)行完成比如插入操作,后一個(gè)方法是不會(huì)事務(wù)回滾的。
最近開(kāi)發(fā),有地方需要用到多線程,每個(gè)線程里面處理多個(gè)方法,過(guò)程中遇到了一個(gè)問(wèn)題,我們使用平時(shí)的@Transactional注解,就是當(dāng)前一個(gè)方法執(zhí)行完成(比如插入操作),后一個(gè)方法是不會(huì)事務(wù)回滾的。當(dāng)時(shí)覺(jué)得很不可思議,后來(lái)經(jīng)過(guò)半天時(shí)間,終于挖出原因,并成功解決。
我這里先說(shuō)明原因:多線程底層連接數(shù)據(jù)庫(kù)的時(shí)候,時(shí)使用的線程變量(TheadLocal),所以,開(kāi)多少線程理論上就會(huì)建立多少個(gè)連接,每個(gè)線程有自己的連接,事務(wù)肯定不是同一個(gè)了。
解決辦法:我強(qiáng)制手動(dòng)把每個(gè)線程的事務(wù)狀態(tài)放到一個(gè)同步集合里面。然后如果有單個(gè)異常,循環(huán)回滾每個(gè)線程。
代碼如下:
//先在開(kāi)啟多線程外面,定義一個(gè)同步集合: ListtransactionStatuses = Collections.synchronizedList(new ArrayList ()); //開(kāi)啟多線程 executorService.execute(new Runnable() { @Override public void run() { DefaultTransactionDefinition def = new DefaultTransactionDefinition(); def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); // 事物隔離級(jí)別,開(kāi)啟新事務(wù),這樣會(huì)比較安全些。 TransactionStatus status = transactionManager.getTransaction(def); // 獲得事務(wù)狀態(tài) transactionStatuses.add(status); try{ //邏輯1 ... //邏輯2 ... }catch(Exception e){ } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/69581.html
摘要:起因及介紹在處理原始對(duì)賬文件的時(shí)候,我將數(shù)據(jù)歸類(lèi)后批量存入相應(yīng)的表中。結(jié)論事務(wù)只能管著開(kāi)啟事務(wù)的線程,其他子線程出了問(wèn)題都感知不到,所以在多線程環(huán)境操作要慎重。高頻容易搞死服務(wù)器,低頻會(huì)阻塞自身程序。重試次數(shù)和超時(shí)時(shí)間根據(jù)業(yè)務(wù)情況設(shè)置。 起因及介紹 在處理原始對(duì)賬文件的時(shí)候,我將數(shù)據(jù)歸類(lèi)后批量存入相應(yīng)的表中。在持久化的時(shí)候,用了parallelStream(),想著同時(shí)存入很多表這樣可...
摘要:和事務(wù)的關(guān)系關(guān)系型數(shù)據(jù)庫(kù)某些消息隊(duì)列等產(chǎn)品或中間件稱(chēng)為事務(wù)性資源,因?yàn)樗鼈儽旧碇С质聞?wù),也能夠處理事務(wù)。事務(wù)的傳播特性,,,,,,強(qiáng)制要求要有一個(gè)物理事務(wù)。外圍事務(wù)不會(huì)被內(nèi)部事務(wù)的回滾狀態(tài)影響。不支持當(dāng)前事務(wù)。 Spring和事務(wù)的關(guān)系 關(guān)系型數(shù)據(jù)庫(kù)、某些消息隊(duì)列等產(chǎn)品或中間件稱(chēng)為事務(wù)性資源,因?yàn)樗鼈儽旧碇С质聞?wù),也能夠處理事務(wù)。 Spring很顯然不是事務(wù)性資源,但是它可...
閱讀 726·2023-04-25 17:54
閱讀 2986·2021-11-18 10:02
閱讀 1143·2021-09-28 09:35
閱讀 663·2021-09-22 15:18
閱讀 2867·2021-09-03 10:49
閱讀 3065·2021-08-10 09:42
閱讀 2588·2019-08-29 16:24
閱讀 1267·2019-08-29 15:08