Spring中事務配置以及事務不起作用可能出現的問題


前言:在Spring中可以通過對方法進行事務的配置,而不是像原來通過手動寫代碼的方式實現事務的操作,這在很大程度上減少了開發的難度,本文介紹Spring事務配置的兩種方式:基於配置文件的方式和基於注解的方式。並對配置過程中可能出現的問題作出總結。


一、基於配置文件的方式

 1     <context:component-scan base-package="com.learning"/>
 2 
 3     <!-- c3p0連接池配置--><!--注意最好是加上編碼的設置,並注意在xml文件中&需要進行轉義,通過&amp;進行轉義-->
 4     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
 5           destroy-method="close"
 6           p:driverClass="com.mysql.jdbc.Driver"
 7           p:jdbcUrl="jdbc:mysql://localhost:3306/springlearning?useUnicode=true&amp;characterEncoding=UTF-8"
 8           p:user="root"
 9           p:password=""/>
10 
11     <!-- 配置jdbcTemplate模板-->
12     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"
13           p:dataSource-ref="dataSource"/>
14 
15 
16     <!-- 事務配置 3步,比較固定,注意數據庫的引擎,是否支持事務-->
17     <!--MySql默認數據引擎為MyISAM,是不支持事務,需改成InnoDB才能進行事務的操作-->
18     <!-- 1.配置事務,開啟spring的事務管理-->
19 
20     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
21           p:dataSource-ref="dataSource"/>
22    
23     <!-- 2.然后配置事務的增強-->
24     <tx:advice id="txAdvice" transaction-manager="transactionManager">
25         <!-- 做事務操作-->
26         <tx:attributes>
27             <!-- 設置進行事務操作的方法匹配規則,就是對什么方法進行事務操作,這里可以直接寫方法名,也可以直接寫*,表示對所有方法開啟事務支持-->
28             <tx:method name="*"/>
29         </tx:attributes>
30 
31     </tx:advice>
32 
33     <!-- 3.然后配置切面-->
34     <aop:config>
35 
36         <!-- 切入點-->                                  <!--service包下,所有類中的所有方法都設置為切入點-->
37         <aop:pointcut id="servicePointcut" expression="execution(* com.learning.service..*(..))"/>
38 
39         <!-- 切面-->
40         <aop:advisor advice-ref="txAdvice" pointcut-ref="servicePointcut"/>
41     </aop:config>

注:配置文件中,對相應步驟都有詳細說明,主要分三步:1.配置事務管理;2.配置事務增強;3.進行切面配置。

二、基於注解的方式

 1     <!-- 開啟注解掃描-->
 2     <context:component-scan base-package="com.learning"/>
 3 
 4     <!-- c3p0連接池配置-->
 5     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
 6           destroy-method="close"
 7           p:driverClass="com.mysql.jdbc.Driver"
 8           p:jdbcUrl="jdbc:mysql://localhost:3306/springlearning?useUnicode=true&amp;characterEncoding=UTF-8"
 9           p:user="root"
10           p:password=""/>
11 
12     <!-- 配置jdbcTemplate模板-->
13     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"
14           p:dataSource-ref="dataSource"/> 
17     <!--基於注解的方式,在配置文件中只需兩步-->
18 
19     <!-- 1.配置事務,開啟spring的事務管理-->
20 
21     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
22           p:dataSource-ref="dataSource"/>
23 
24     <!--2.開啟事務注解掃描-->
25     <tx:annotation-driven transaction-manager="transactionManager"/>

注:基於注解的方式,在配置文件中只需兩步:1.配置事務管理器(不管是基於配置文件方式或者注解方式,這一步都是必須的);2.開啟事務注解掃描;3.在需要進行事務操作的方法上添加注解@Transactional通過以上3個步驟即可完成方式事務的開啟,注意不要忘了在所需開啟事務的方法上添加注解。

Spring事務配置不起作用可能出現的問題:

1.是否是數據庫引擎設置不對造成的【筆者就遇到了這個問題,由於筆者使用的是mysql數據,但是在創建表的時候引擎默認(mysql中引擎默認為MyISAM,是不支持事務操作的),需要修改為InnoDB,就可以支持事務操作了

2.入口函數必須是public,否則事務不起作用。這一點由Spring的AOP特性決定的。

這就是筆者在配置事務過程中所遇到的問題,如再遇任何問題,則繼續補充。


by Shawn Chen,2018.1.11日,晚。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM