一、前提
spring配置文件分为两个:web容器配置文件和逻辑容器配置文件
逻辑容器配置文件包含了如下配置:
<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="cfmDataSource" />
</bean>
<tx:annotation-driven transaction-manager="txManager"/>
二、使用注解 @Transactional实现事务的注意点
1、请确认事务与逻辑注解扫描在同一个容器里,这样才能保证事务的正常开启。(例如:误将注解都扫描在web容器,但是web容器没有配置事务,事务是配置在逻辑容器里,这样导致事务没有开启)。
修改前:
<context:component-scan base-package=“com.hcb.confirmation”/>
修改后:
<context:component-scan base-package="com.hcb.confirmation">
<context:exclude-filter type="annotation" expression="javax.inject.Named"/>
</context:component-scan>
2、是否回滚规则如下:
默认遇到throw new RuntimeException("...");会回滚需要捕获的throw new Exception("...");不会回滚
如果Exception也需要回滚,那么这样声明注解:@Transactional(rollbackFor=Exception.class)
3、如果用mysql数据库,Engine需要设置为InnoDB格式,自动建表的格式为:MyISAM,这中格式的是不支持事务管理的。
show engines;
show variables like '%storage_engine%';
show create table tablename;
4、与声明式的事务不同,注解方式不需要引用aspectj的jar
参考文章:http://www.th7.cn/Program/java/201208/88393.shtml