解決多執行緒批量插入中的事物一致性問題

2021-10-23 07:35:11 字數 861 閱讀 6770

在開發當中我們,我們有時為了加快執行速度,會使用到多執行緒!尤其在大量資料插入資料庫時,我們需要使用多執行緒進行批量插入,加快程式的執行效率!

但是由於多執行緒中每個執行緒的事物是不一致的導致程式不一致!為了保證多個執行緒執行插入時,事物的一致性!我們需要將每個執行緒的事物狀態儲存到乙個集合當中,當其中某個執行緒丟擲異常時,我將所有執行緒的事物進行回滾!

實現思路:

1、將所有執行緒的事物狀態儲存到乙個集合裡面,該集合必須是執行緒安全的!

2、定義乙個集合,當執行緒發生異常時,往集合裡面新增資料!

3、當異常標誌集合中存在資料時,說明有執行緒執行出錯了!需要全部回滾資料!

具體實現**如下:

1、注入事物管理類

@autowired

private platformtransactionmanager transactionmanager;

2、具體實現**

public void testthreadinsert()  catch (exception e) 

countdownlatch.countdown();

});} try

log.info("執行了回滾過程,回滾事物資料集合大小" + transactionstatuses.size());

}long time2 = system.currenttimemillis();

log.info("執行批量插入資料耗時" + (int) ((time2 - time1)) / 1000 + "秒");

} catch (interruptedexception e)

}

上面是主要**,其他**和往常crud一樣!

海量併發下的事物一致性

事物 一系列操作,要麼都執行,要麼都不執行。事物的一致性 分布式的情況下,比如下訂單,有訂單系統,商品庫存,支付系統等。每乙個子系統執行的操作,都是乙個事物。所有子系統執行的操作,合起來還可以看成乙個事物。強一致性 就是同步執行各個事物,所有都正確執行。最終一致性 可以通過訊息佇列完成,比如商品和支...

分布式一致性演算法Paxos JAVA多執行緒方式實現

準備提案過程,獲得大多數決策者支援後進入確認提案階段。public synchronized boolean prepare 獲得承諾 if prepareresult.ispromised else 決策者已經通過了乙個題案 if prepareresult.getacceptorstatus a...

無法跨執行緒操作,與建立控制項的執行緒不一致 解決方案

錯誤請看 private void change private void button1 click object sender,eventargs e 按鈕事件 解決方法 private void change private void threadchange 通過委託處理,msdn上又很詳細...