1、Spring事务处理
Spring框架它是全面的支持事务支持,它提供一致的事务管理方式
--提供简单易用的编程式事务管理API
--支持声明式事务管理
1.1、编程式事务
使用编程式事务时,Spring提供以下两种事务管理的API
--TransactionTemplate
--PlatformTransactionManager
如果采用编程式事务管理,推荐使用TransactionTemplate
TransactionTemplate与Spring中JdbcTemplate等模板类风格相似,它也使用
回调机制,将事务代码和业务代码分离便于开发者将精力集中在具体业务编
程上。
transactionTemplate.execute(new TransactionCallback(){
public Object doInTransaction(TransactionStatus status){
//业务操作
updateOperation();
return resultOfUpdateOperation();
}
});
如果不需要返回值,可以创建一个TransactionCallbackWithoutResult
的匿名类。
transactionTemplate.execute(new TransactionCallbackWithoutResult{
updateOperation();
status.setRollbackOnly();
});
1.2、声明式事务
Spring的声明式事务管理是通过Spring AOP实现的,使用时不需要修改原有的业务代码,只需要通过简单配置就可以追加事务控制功能,大多数Spring用户选择声明式事务管理,对程序代码影响最小,也符合非侵入的理念。
2、注解实现声明式事务
(1)在配置文件中声明事务组件,开启事务注解扫描
<!-- 声明事务管理组件 -->
<bean id="" class="">
<property name="dataSource" ref="ds" />
</bean>
<!-- 开启事务注解扫描-->
<tx:annocation-driven transaction-manager="" />
transaction-manager指定事务管理器,需要根据数据库访问技术的不同选择不同的实现,例如JDBC,MyBatis技术选择DataSourceTransactionManager,而Hibernate技术则选择HibernateTransactionManager
(2)使用@Transactional注解
@Transactional注解标记可以用在类定义前和方法定义前
方法的事务设置将优于类级别注解的事务设置
@Transactional注解标记有以下属性,在使用时可以根据需要做指定
-propagation:事务传播,默认值是propagation_required
-isolation:事务隔离级别,默认值是isolation_default
-readOnly:只读/读写,默认值是可读写
-rollbackFor:遇到哪些异常回滚
-noRollbackFor:遇到哪些异常不回滚
注意:
任何RuntimeException将触发事务回滚, 但是任何CheckedException将不触发事务回滚。
3、XML配置实现声明式事务
在配置文件中声明事务管理组件,配置事务作用的范围及类型
<!-- 声明事务管理组件-->
<bean id="" class="">
<property name="dataSource" ref="ds" />
</bean>
<!-- XML配置声明事务范围及类型-->
<tx:advice id="" transaction-manager=“”>
<tx:attributes>
<tx:method name=”” propagation=””/>
<tx:method name=”” read-only=””/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:advisor advice-ref =”” pointcut=””>
</aop:config>
4、事务回滚
默认情况下RuntimeException异常将触发事务回滚,任何CheckedException将不触发事务回滚,常见RuntimeException和CheckedException如下:
RuntimeException:
NullpointException
ClassCastException
NumberFormatException
IndexOutOfBoundsException
CheckedException:
ClassNotFoundException
IOException
对于CheckedException,需要手动指定异常类型,才能实现事务回滚
--使用注解实现声明式事务,按如下方式指定异常:
@Transactional(rollbackFor=Exception.class)
--使用XML配置实现声明式事务时,按如下方式指定异常:
<tx:method name=“” rollback-for=>
当使用自定义异常,异常类只有继承RuntimeException时才会自动回滚,否则需要指定事务回滚的异常类型
5、事务传播
是指一个方法调用了另一个带有事务控制的方法,就需要指定事务传播的处理方案
6、事务隔离
在数据操作的过程中,如果两个事务并发执行,那么彼此之间的数据会发生影响,为了避免这种并发冲突,需要将这两个事务隔离开