Springboot @Transactional大事務處理的幾點建議
1.大事務:
總體任務對應的事務運行時間比較長,長時間未提交的事務。
2.大事務的危害:
a.并發(fā)情況下,數(shù)據(jù)庫連接池資源占滿。大事務提交不及時,導致連接資源釋放緩慢。
b.數(shù)據(jù)庫死鎖和鎖等待。mysql innodb存儲引擎背景下,事務如果占用了排他鎖,會容易導致并發(fā)情況下數(shù)據(jù)死鎖或者鎖等待。
c.大事務Rt時間長,容易導致接口超時。
d.大事務回滾時間長。
e.數(shù)據(jù)庫主從架構下,數(shù)據(jù)同步延遲
3.解決辦法
3.1 將聲明式事務的@Transactional方式 合理的替換為 編程式事務TransactionTemplate 的方式
聲明式事務的粒度最小是整個方法,可能會導致業(yè)務里不必要的邏輯都加了事務。編程式事務細化需要加事務的邏輯上,形成實際有用的事務塊。
@Autowired private TransactionTemplate transactionTemplate; public void testTransaction() { transactionTemplate.execute(new TransactionCallbackWithoutResult() { @Override protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) { try { // .... 業(yè)務代碼 } catch (Exception e){ //回滾 transactionStatus.setRollbackOnly(); } } }); }
3.2 將查詢放在事務方法外
使用@Transactional 又想避免產(chǎn)生大事務,需對方法進行拆分,將不需要事務管理的邏輯與事務操作分開
@Service public class TransactionTestService{ // 避免同一個類內部方法相互調用,實例方法調用代理方法而導致事務失效 @Resource private TransactionTestService service; public void create(ParamDto dto){ queryData1(); queryData2(); service.save(dto); } //事務操作 @Transactional(rollbackFor = Exception.class) public void save(ParamDto dto){ paramDao.insert(dto); } }
3.3 避免跨服務間的遠程調用
服務間的通訊及服務之間的調用時間 受網(wǎng)絡環(huán)境和遠端接口Rt時間的影響,可能會比較耗時。
反例: //事務操作 @Transactional(rollbackFor = Exception.class) public void save(ParamDto dto){ // 調用了其他服務 otherRemoteApi(); paramDao.insert(dto); } 修改為: @Autowired private TransactionTemplate transactionTemplate; public void save(ParamDto dto){ // 調用了其他服務 otherRemoteApi(); transactionTemplate.execute(new TransactionCallbackWithoutResult() { @Override protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) { try { paramDao.insert(dto); } catch (Exception e){ //回滾 transactionStatus.setRollbackOnly(); } } }); }
3.4 事務中不應該一次性處理太多的數(shù)據(jù),可以使用分批執(zhí)行
3.5事務中的方法可以根據(jù)業(yè)務使用異步執(zhí)行
到此這篇關于Springboot @Transactional大事務處理的幾點建議的文章就介紹到這了,更多相關Springboot @Transactional大事務內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
如何在Spring?Boot框架中使用攔截器實現(xiàn)URL限制
在Spring?Boot框架中,您可以使用攔截器(Interceptor)來控制限制URL列表,本文通過一個簡單的示例給大家介紹Spring?Boot?攔截器實現(xiàn)URL限制的操作方法,感興趣的朋友跟隨小編一起看看吧2023-08-08序列化版本號serialVersionUID的作用_動力節(jié)點Java學院整理
Java序列化是將一個對象編碼成一個字節(jié)流,反序列化將字節(jié)流編碼轉換成一個對象,這篇文章主要介紹了序列化版本號serialVersionUID的作用,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05