You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

3.4 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

所谓声明式事务就是通过配置的方式比如通过配置文件xml或者注解的方式告诉spring哪 些方法需要spring帮忙管理事务然后开发者只用关注业务代码而事务的事情spring自动帮我们控制。 比如注解的方式,只需在方法上面加一个 @Transaction 注解那么方法执行之前spring会自动开启一 个事务,方法执行完毕之后,会自动提交或者回滚事务,而方法内部没有任何事务相关代码,用起来特 别的方法。

声明式事务的2种实现方式

  1. 配置文件的方式即在spring xml文件中进行统一配置开发者基本上就不用关注事务的事情了代码中无需关心任何和事务相关的代码一切交给spring处理。
  2. 注解方式只需在需要spring来帮忙管理事务的方法上加上@Transaction注解就可以了

声明式事务注解方式5个步骤

1、启用Spring的注释驱动事务管理功能

!Snipaste_2023-02-20_10-02-28 4.png 当spring容器启动的时候发现有@EnableTransactionManagement注解此时会拦截所有bean的创建扫描看一下bean上是否有@Transaction注解类、或者父类、或者接口、或者方法中有这个注解都可以如果有这个注解spring会通过aop的方式给bean生成代理对象代理对象中会增加一个拦截器TransactionInterceptor拦截器会拦截bean中public方法执行会在方法执行之前启动事务方法执行完毕之后提交或者回滚事务。

2、定义事务管理器

事务交给spring管理那么你肯定要创建一个或者多个事务管理者有这些管理者来管理具体的事务 比如启动事务、提交事务、回滚事务,这些都是管理者来负责的。 spring中使用PlatformTransactionManager这个接口来表示事务管理者。PlatformTransactionManager多个实现类用来应对不同的环境。 !Snipaste_2023-02-20_10-02-28 5.png JpaTransactionManager如果你用jpa来操作db那么需要用这个管理器来帮你控制事务。 DataSourceTransactionManager如果你用是指定数据源的方式比如操作数据库用的是 JdbcTemplate、mybatis、ibatis那么需要用这个管理器来帮你控制事务。 HibernateTransactionManager如果你用hibernate来操作db那么需要用这个管理器来帮你控制事务。 JtaTransactionManager如果你用的是java中的jta来操作db这种通常是分布式事务此时需要用这种管理器来控制事务。

!Snipaste_2023-02-20_10-02-28 6.png

3、需使用事务的目标上加@Transaction注解

@Transaction放在接口上那么接口的实现类中所有public都被spring自动加上事务 @Transaction放在类上那么当前类以及其下无限级子类中所有pubilc方法将被spring自动加上事务 @Transaction放在public方法上那么该方法将被spring自动加上事务 注意:@Transaction只对public方法有效

!Snipaste_2023-02-20_10-02-28 7.png

4、执行db业务操作

在@Transaction标注类或者目标方法上执行业务操作此时这些方法会自动被spring进行事务管理。 !Snipaste_2023-02-20_10-02-28 8.png

如何确定方法有没有用到spring事务

1.断点调试

!Snipaste_2023-02-20_10-02-28 9.png

2.日志

!Snipaste_2023-02-20_10-02-28 10.png !Snipaste_2023-02-20_10-02-28 11.png