【程式設計開發】之開發解決的“坑“
本地事務失效問題
總結:同一個物件內事務方法之間互相呼叫時,事務預設會失效,原因是繞過了代理物件。
在 SpringBoot 裡面我們使用 @Transactional(propagation=Propagation.REQUIRED)
註解來開啟事務,如果是不同服務之間的呼叫,比如:A 服務的 a() 方法呼叫了 B 服務的 b() 方法,a、b 方法都開啟了事務,那麼它們各自的事務是有效的。
但如果在同一個 Service 中有 a()、b()、c() 三個方法,每個方法都開啟了事務,比如,我 a 方法的事務傳播行為是 REQUIRED
,而 b 的事務傳播行為是 REQUIRED_NEW
,當 a 方法呼叫了 b 方法時,b 方法的事務是不生效的。
後面我去查詢了一下關於 SpringBoot 事務的相關原理,發現,原來我們的事務是使用代理物件來控制的,如果在同一個物件內進行事務方法互相呼叫的話預設會失效,因為它繞過了代理物件,相當於把我們 b 方法直接複製到了 a 方法中。
然後我使用的解決辦法就是:使用代理物件來呼叫事務方法。
1、引入 aop - starter 依賴
<!-- 引入aop -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
它裡面包含了 AspectJ 動態代理
2、然後使用 @EnableAspectJAutoProxy(exposeProxy = true)
註解開啟 AspectJ 動態代理功能。
開啟以後,所有的動態代理都是使用 AspectJ 建立而不是使用 JDK 的預設動態代理(即使沒有藉口也可以建立動態代理)。
3、本地事務之間的互相呼叫使用動態代理來呼叫即可:
public class OrderServiceImpl extends ServiceImpl<OrderDao, OrderEntity> implements OrderService {
@Transactional(timeout = 30)
public void a() {
// 使用動態代理呼叫本地其他事務
OrderServiceImpl orderService = (OrderServiceImpl) AopContext.currentProxy();
orderService.b();
orderService.c();
}
@Transactional(propagation=Propagation.REQUIRED_NEW)
public void b() {
// ....
}
@Transactional(propagation=Propagation.REQUIRED)
public void c() {
// ....
}
}
相關文章
- 一、產品開發設計的坑
- Flutter開發之非同步程式設計Flutter非同步程式設計
- 【程式設計開發】之 OAuth2程式設計OAuth
- 開發遇到的坑之blockBloC
- wepy+weappx開發小程式遇到的坑以及解決方案APP
- Java 程式設計開發Java程式設計
- WDM驅動程式設計之設計開發篇 (轉)程式設計
- 從程式設計、工程專案到解決方案、團隊開發程式設計
- 智慧小程式開發解決方案
- WEB程式設計開發常用的程式碼Web程式設計
- 小程式開發入坑之旅
- 微信小程式開發遇到的那些坑微信小程式
- Spark開發-RDD介面程式設計Spark程式設計
- 【敏捷開發】結對程式設計敏捷程式設計
- 微信小程式開發常見坑微信小程式
- 微信小程式開發系列(一) :開發環境搭建和微信小程式的檢視設計與開發微信小程式開發環境
- 微信小程式開發—專案實戰之計算器開發微信小程式
- 11個年頭之後我開始退出了程式設計開發程式設計
- 程式設計師要避免的開發模式程式設計師模式
- iOS開發 面向切面程式設計之 Aspects 原始碼解析iOS程式設計原始碼
- Java程式設計開發之資料圖表分析模型Java程式設計模型
- 程式設計體系結構(07):JavaEE之Web開發程式設計JavaWeb
- 遊戲開發新手入門之Windows程式設計(轉)遊戲開發Windows程式設計
- iOS開發的那些坑iOS
- mpvue & 小程式開發過程中的坑Vue
- 微信公眾號開發之坑(一)
- TCP程式設計之服務端和客戶端的開發TCP程式設計服務端客戶端
- 建立開發程式設計機制 (轉)程式設計
- Java開發程式設計師:JVM相關的知識講解Java程式設計師JVM
- 最早做遊戲設計與開發的女程式設計師遊戲設計程式設計師
- 開發小程式過程中採坑
- 自由程式設計師的3個開發技巧程式設計師
- 好程式設計師web前端開發測驗之css部分程式設計師Web前端CSS
- iOS 開發視覺化程式設計之Xib 簡述iOS視覺化程式設計
- Socket開發框架之框架設計及分析框架
- 小程式開發,那些我們跳過的坑
- iOS開發之UIRefreshControl使用踩坑iOSUI
- 支付開發填坑記之支付寶