3.4 KiB
所谓声明式事务,就是通过配置的方式,比如通过配置文件(xml)或者注解的方式,告诉spring,哪 些方法需要spring帮忙管理事务,然后开发者只用关注业务代码,而事务的事情spring自动帮我们控制。 比如注解的方式,只需在方法上面加一个 @Transaction 注解,那么方法执行之前spring会自动开启一 个事务,方法执行完毕之后,会自动提交或者回滚事务,而方法内部没有任何事务相关代码,用起来特 别的方法。
声明式事务的2种实现方式
- 配置文件的方式,即在spring xml文件中进行统一配置,开发者基本上就不用关注事务的事情了,代码中无需关心任何和事务相关的代码,一切交给spring处理。
- 注解方式,只需在需要spring来帮忙管理事务的方法上加上@Transaction注解就可以了
声明式事务注解方式5个步骤
1、启用Spring的注释驱动事务管理功能
!
当spring容器启动的时候,发现有@EnableTransactionManagement注解,此时会拦截所有bean的创建,扫描看一下bean上是否有@Transaction注解(类、或者父类、或者接口、或者方法中有这个注解都可以),如果有这个注解,spring会通过aop的方式给bean生成代理对象,代理对象中会增加一个拦截器(TransactionInterceptor),拦截器会拦截bean中public方法执行,会在方法执行之前启动事务,方法执行完毕之后提交或者回滚事务。
2、定义事务管理器
事务交给spring管理,那么你肯定要创建一个或者多个事务管理者,有这些管理者来管理具体的事务,
比如启动事务、提交事务、回滚事务,这些都是管理者来负责的。
spring中使用PlatformTransactionManager这个接口来表示事务管理者。PlatformTransactionManager多个实现类,用来应对不同的环境。
!
JpaTransactionManager:如果你用jpa来操作db,那么需要用这个管理器来帮你控制事务。
DataSourceTransactionManager:如果你用是指定数据源的方式,比如操作数据库用的是:
JdbcTemplate、mybatis、ibatis,那么需要用这个管理器来帮你控制事务。
HibernateTransactionManager:如果你用hibernate来操作db,那么需要用这个管理器来帮你控制事务。
JtaTransactionManager:如果你用的是java中的jta来操作db,这种通常是分布式事务,此时需要用这种管理器来控制事务。
3、需使用事务的目标上加@Transaction注解
@Transaction放在接口上,那么接口的实现类中所有public都被spring自动加上事务 @Transaction放在类上,那么当前类以及其下无限级子类中所有pubilc方法将被spring自动加上事务 @Transaction放在public方法上,那么该方法将被spring自动加上事务 注意:@Transaction只对public方法有效
4、执行db业务操作
在@Transaction标注类或者目标方法上执行业务操作,此时这些方法会自动被spring进行事务管理。
!