Spring中事务配置以及事务不起作用可能出现的问题
前言:在Spring中可以通过对方法进行事务的配置,而不是像原来通过手动写代码的方式实现事务的操作,这在很大程度上减少了开发的难度,本文介绍Spring事务配置的两种方式:基于配置文件的方式和基于注解的方式。并对配置过程中可能出现的问题作出总结。
一、基于配置文件的方式
1 <context:component-scan base-package="com.learning"/> 2 3 <!-- c3p0连接池配置--><!--注意最好是加上编码的设置,并注意在xml文件中&需要进行转义,通过&进行转义--> 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&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&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日,晚。