一、什么是事物
在我们开发过程中,有很多需要事物的业务场景。比如:在我们转账的场景中,用户A需要转账500元给用户B。在用户A账户中扣除500元后,发生了异常,这时候用户B增加500元的语句可能就不会执行。就会导致转账的丢失。此时就需要事物管理将扣除500元的操作进行回滚。也就是说事物内的语句,要么全部执行成功,要么全部执行失败。
二、事物管理的几种方式
spring中的事物管理主要分为两大类:编程式事物管理和声明式事物管理
其中编程式事物管理就是在我们编程的过程中,通过代码执行commit或rollback语句,来实现事物的提交和回滚。这种方式我们在此不做详细讲解。
另外一种就是声明式事物管理。声明式事物管理主要分为XML配置声明和@Transactional注解声明方式。
Spring 的声明式事务管理是建立在 Spring AOP 机制之上的,其本质是对目标方法前后进行拦截,并在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。
声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中作相关的事务规则声明(或通过等价的基于标注的方式),便可以将事务规则应用到业务逻辑中。总的来说,声明式事务得益于 Spring IoC容器 和 Spring AOP 机制的支持:IoC容器为声明式事务管理提供了基础设施,使得 Bean 对于 Spring 框架而言是可管理的;而由于事务管理本身就是一个典型的横切逻辑(正是 AOP 的用武之地),因此 Spring AOP 机制是声明式事务管理的直接实现者。
显然,声明式事务管理要优于编程式事务管理,这正是spring倡导的非侵入式的开发方式。声明式事务管理使业务代码不受污染。
三、声明式事物管理的实现方式
1.xml配置方式实现
<!-- 配置事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/> //这里的ref映射需要指定数据源
</bean>
<!-- 拦截器方式配置事物 -->
<tx:advice id="transactionAdvice" transaction-manage