欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

spring本地事務失效的原因分析

 更新時間:2023年10月23日 09:13:10   作者:磚瓦程序猿  
這篇文章給大家介紹了spring本地事務失效的情況原因分析,給大家羅列了五種原因分析,通過代碼示例介紹的非常詳細,具有一定的參考價值,需要的朋友可以參考下

spring本地事務失效的情況

原因1:未使用@Transactional注解

解決辦法:

確保事務管理方法上使用了@Transactional注解,這會告訴Spring該方法應該在事務內執(zhí)行。例如:

@Service
public class MyService {
    @Transactional
    public void doSomething() {
        // 執(zhí)行事務操作
    }
}

原因2:配置問題

解決辦法:

檢查Spring事務管理器的配置。確保Spring配置文件中包含了正確的事務管理器定義,如DataSourceTransactionManager。例如:

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

原因3:方法調用問題(重要)

解決辦法:

確保事務內部的方法是通過代理對象調用的,而不是直接調用的。Spring的事務代理只能捕獲通過代理對象的方法調用來管理事務。如果在同一個類中的一個事務方法內部調用另一個事務方法,事務可能因為繞過了代理對象導致失效。確保這些方法被放在不同的類中或通過自我調用(如通過AopContext.currentProxy())來確保事務生效。

1.自我調用需要引入aop模塊

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

2.啟動類開啟動態(tài)代理

開啟 aspectj 動態(tài)代理功能。以后所有的動態(tài)代理都是aspectj創(chuàng)建的(即使沒有接口也可以創(chuàng)建動態(tài)代理)

@EnableAspectJAutoProxy
@SpringBootApplication
public class BootTestApplication {
    public static void main(String[] args) {
        SpringApplication.run(BootTestApplication.class, args);
    }
}

3.具體使用

可以直接把我們的service用代理方式創(chuàng)建,例如有一個BookService:

public BookServiceImpl implements BookService{
	BookServiceImpl bookService = (BookServiceImpl) AopContext.currentProxy();
	//...
}

這樣同一service中(叫本類方法互調)的方法設置好的傳播行為將會生效。

原因4:異常處理問題(重要)

解決辦法:

如果在一個事務方法內拋出了未捕獲的異常,事務可能會被回滾。確保適當?shù)靥幚懋惓?,或者在@Transactional注解上使用rollbackFor屬性來指定需要回滾的異常類型。例如:

@Transactional(rollbackFor = Exception.class)
public void doSomething() {
    // 執(zhí)行事務操作
}

原因5:嵌套事務問題(重要)

解決辦法:

Spring支持嵌套事務,但默認情況下,嵌套事務可能不會生效??梢栽谕鈱臃椒ㄉ鲜褂脗鞑ゼ墑e來解決。@Transactional(propagation = Propagation.REQUIRED),以確保嵌套事務能夠正常工作。

事務傳播級別

傳播級別解釋
REQUIRED(默認):如果當前沒有事務,新建一個事務,并在方法執(zhí)行期間使用該事務。如果當前已存在一個事務,加入該事務,成為該事務的一部分。
REQUIRES_NEW無論當前是否存在事務,都會新建一個事務,原有事務會被掛起。在方法執(zhí)行結束后,新建的事務提交或回滾,原有事務會恢復執(zhí)行。
SUPPORTS如果當前存在事務,加入該事務,成為該事務的一部分。如果當前沒有事務,以非事務方式執(zhí)行。
NOT_SUPPORTED以非事務方式執(zhí)行。如果當前存在事務,將其掛起。
MANDATORY要求當前存在一個事務,否則會拋出異常。如果當前存在事務,加入該事務。
NEVER以非事務方式執(zhí)行。如果當前存在事務,拋出異常。
NESTED如果當前存在事務,嵌套一個新的事務。如果當前沒有事務,行為與REQUIRED相同。嵌套事務的提交和回滾將影響外部事務。
NESTED_ROLLBACK_ON_RUNTIME_EXCEPTION(Spring 5.0引入)類似于NESTED,但只在運行時異常發(fā)生時回滾嵌套事務。

兩種使用方式

@Service
public class MyService {
    
    @Transactional(propagation = Propagation.REQUIRED)
    public void methodA() {
        // ...
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void methodB() {
        // ...
    }
}

<bean id="myService" class="com.example.MyService">
    <property name="dataSource" ref="dataSource" />
</bean>

<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="methodA" propagation="REQUIRED" />
        <tx:method name="methodB" propagation="REQUIRES_NEW" />
    </tx:attributes>
</tx:advice>

<aop:config>
    <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.example.MyService.*(..))" />
</aop:config>

到此這篇關于spring本地事務失效的原因分析的文章就介紹到這了,更多相關spring本地事務失效內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java中的switch新特性與使用詳解

    Java中的switch新特性與使用詳解

    這篇文章主要介紹了Java中的switch新特性與使用詳解,Switch語句可以實現(xiàn)根據(jù)某一變量選則執(zhí)行代碼塊,當然直接使用If語句也可以做到,但是有時候使用Switch語句往往更加簡潔優(yōu)美,需要的朋友可以參考下
    2023-11-11
  • 詳解如何將Spring Boot應用跑在Docker容器中

    詳解如何將Spring Boot應用跑在Docker容器中

    這篇文章主要介紹了詳解如何將Spring Boot應用跑在Docker容器中,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-07-07
  • java FastJson的簡單用法

    java FastJson的簡單用法

    FastJson是阿里的開源JSON解析庫,可以解析JSON格式的字符串,支持將Java Bean序列化為JSON字符串,也可以從JSON字符串反序列化到JavaBean,這里我介紹一下FastJson的使用,感興趣的朋友一起看看吧
    2021-09-09
  • SpringBoot中實現(xiàn)文件上傳、下載、刪除功能的步驟

    SpringBoot中實現(xiàn)文件上傳、下載、刪除功能的步驟

    本文將詳細介紹如何在 Spring Boot 中實現(xiàn)文件上傳、下載、刪除功能,采用的技術框架包括:Spring Boot 2.4.2、Spring MVC、MyBatis 3.5.6、Druid 數(shù)據(jù)源、JUnit 5 等,文中有詳細的操作步驟和示例代碼供大家參考,需要的朋友可以參考下
    2024-01-01
  • Java并發(fā)編程之常用的多線程實現(xiàn)方式分析

    Java并發(fā)編程之常用的多線程實現(xiàn)方式分析

    這篇文章主要介紹了Java并發(fā)編程之常用的多線程實現(xiàn)方式,結合實例形式分析了java并發(fā)編程中多線程的相關原理、實現(xiàn)方法與操作注意事項,需要的朋友可以參考下
    2020-02-02
  • java DateUtil工具類時間戳類型轉換詳解

    java DateUtil工具類時間戳類型轉換詳解

    這篇文章主要為大家詳細介紹了java DateUtil工具類時間戳類型轉換的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Spring MessageSource獲取消息不符合預期的問題解決方案

    Spring MessageSource獲取消息不符合預期的問題解決方案

    最近我參與的產品要做國際化支持,選擇了用Spring MessageSource來實現(xiàn),這個Spring 框架提供的工具使用很簡單,網(wǎng)上有各種教程文章,這里不做贅述,只說一個實際遇到的問題及解決方案,需要的朋友可以參考下
    2024-01-01
  • mac系統(tǒng)剛安裝的idea打不開的問題及解決

    mac系統(tǒng)剛安裝的idea打不開的問題及解決

    這篇文章主要介紹了mac系統(tǒng)剛安裝的idea打不開的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Java并發(fā)編程回環(huán)屏障CyclicBarrier

    Java并發(fā)編程回環(huán)屏障CyclicBarrier

    這篇文章主要介紹了Java并發(fā)編程回環(huán)屏障CyclicBarrier,文章繼續(xù)上文所介紹的Java并發(fā)編程同步器CountDownLatch展開主題相關內容,需要的小伙伴可以參考一下
    2022-04-04
  • 基于Java實現(xiàn)QQ登錄注冊功能的示例代碼

    基于Java實現(xiàn)QQ登錄注冊功能的示例代碼

    這篇文章主要和大家分享如何利用Java語言實現(xiàn)QQ登錄、注冊等功能。本文主要應用的技術有:GUI、JDBC、多線程等,需要的可以參考一下
    2022-05-05

最新評論