Springboot @Transactional大事務處理的幾點建議
1.大事務:
總體任務對應的事務運行時間比較長,長時間未提交的事務。
2.大事務的危害:
a.并發(fā)情況下,數(shù)據(jù)庫連接池資源占滿。大事務提交不及時,導致連接資源釋放緩慢。
b.數(shù)據(jù)庫死鎖和鎖等待。mysql innodb存儲引擎背景下,事務如果占用了排他鎖,會容易導致并發(fā)情況下數(shù)據(jù)死鎖或者鎖等待。
c.大事務Rt時間長,容易導致接口超時。
d.大事務回滾時間長。
e.數(shù)據(jù)庫主從架構(gòu)下,數(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{
// 避免同一個類內(nèi)部方法相互調(diào)用,實例方法調(diào)用代理方法而導致事務失效
@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 避免跨服務間的遠程調(diào)用
服務間的通訊及服務之間的調(diào)用時間 受網(wǎng)絡環(huán)境和遠端接口Rt時間的影響,可能會比較耗時。
反例:
//事務操作
@Transactional(rollbackFor = Exception.class)
public void save(ParamDto dto){
// 調(diào)用了其他服務
otherRemoteApi();
paramDao.insert(dto);
}
修改為:
@Autowired
private TransactionTemplate transactionTemplate;
public void save(ParamDto dto){
// 調(diào)用了其他服務
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大事務內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
java冷知識:javac AbstractProcessor詳解
這篇文章主要介紹了java冷知識:javac AbstractProcessor詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11
Java性能優(yōu)化之數(shù)據(jù)結(jié)構(gòu)實例代碼
這篇文章主要介紹了Java性能優(yōu)化之數(shù)據(jù)結(jié)構(gòu)實例代碼,具有一定借鑒價值,需要的朋友可以參考下2018-01-01

