【程式設計開發】之開發解決的“坑“
本地事務失效問題
總結:同一個物件內事務方法之間互相呼叫時,事務預設會失效,原因是繞過了代理物件。
在 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() {
// ....
}
}
相關文章
- wepy+weappx開發小程式遇到的坑以及解決方案APP
- Flutter開發之非同步程式設計Flutter非同步程式設計
- 【程式設計開發】之 OAuth2程式設計OAuth
- Java 程式設計開發Java程式設計
- WEB程式設計開發常用的程式碼Web程式設計
- 智慧小程式開發解決方案
- 小程式開發入坑之旅
- 開發者解讀Angry Birds Evolution的開發創意設計
- iOS開發之UIRefreshControl使用踩坑iOSUI
- iOS開發 面向切面程式設計之 Aspects 原始碼解析iOS程式設計原始碼
- 程式設計體系結構(07):JavaEE之Web開發程式設計JavaWeb
- Java程式設計開發之資料圖表分析模型Java程式設計模型
- TCP程式設計之服務端和客戶端的開發TCP程式設計服務端客戶端
- mpvue & 小程式開發過程中的坑Vue
- 微信小程式開發遇到的那些坑微信小程式
- Java開發程式設計師:JVM相關的知識講解Java程式設計師JVM
- kestrel網路程式設計--開發Fiddler程式設計
- 好程式設計師web前端開發測驗之css部分程式設計師Web前端CSS
- 常用的Python程式設計開發工具有哪些?Python程式設計
- iOS開發的那些坑iOS
- 微信小程式開發系列(一) :開發環境搭建和微信小程式的檢視設計與開發微信小程式開發環境
- ??Java開發者的Python快速進修指南:網路程式設計及併發程式設計JavaPython程式設計
- Java併發程式設計系列之Semaphore詳解Java程式設計
- 頂級程式設計師推薦的程式設計開發書籍【整合】程式設計師
- 開發小程式過程中採坑
- 小程式開發,那些我們跳過的坑
- 聊聊併發程式設計的10個坑,千萬小心!!!程式設計
- java併發程式設計 --併發問題的根源及主要解決方法Java程式設計
- 併發程式設計之volatile程式設計
- 併發程式設計之:Atomic程式設計
- 併發程式設計之:Lock程式設計
- 併發程式設計之:ForkJoin程式設計
- 併發程式設計之:ThreadLocal程式設計thread
- 併發程式設計之:CountDownLatch程式設計CountDownLatch
- 併發程式設計之:synchronized程式設計synchronized
- 併發程式設計之:JMM程式設計
- 併發程式設計之 CAS 的原理程式設計
- Android API開發之OpenGL開發之Android OpenGL STL詳解AndroidAPI