spring配置事务
2017-08-23 本文已影响0人
江小石
maven project下如果有多个模块,事务管理相关配置在web的项目。
spring-application.xml
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
<!-- 对数据源进行事务管理 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
p:dataSource-ref="multipleDataSource"/>
spring中的@Transactional 放在类级别 和 方法级别 上有什么不同?
@Transactional放在类级别上等同于该类的每个方法都放上了@Transactional
事务管理失效的情况:
- 类内部方法调用:service有两个方法A和B,A方法里面调用B,希望B遇到runtime异常会回滚事务,所以B配置了@Transactional,但是A没配。那么调用A的时候不会产生事务,遇到异常没有回滚。如果从外部类直接调用B方法,则事务是可以正常生效的。
原因是spring之所以可以对开启@Transactional的方法B进行事务管理,是因为Spring为当前类生成了一个代理类,然后在执行相关方法时,会判断这个方法有没有@Transactional注解,如果有的话,则会开启一个事务。 但是,上面A方法内部调用B方法调用方式时,在调用B时,使用的并不是代理对象,从而导致@Transactional失败。 - @Transactional 注解应该只被应用到 public 方法上
@Transactional 注解标注的方法中不要出现网络调用、比较耗时的处理程序,因为,事务中数据库连接是不会释放的,如果每个事务的处理时间都非常长,那么宝贵的数据库连接资源将很快被耗尽。