一、事务处理方案:
Spring框架中提供的事务处理方案:一共有两种:
1.适合中小项目使用的, 注解方案:
注解的方式做事务用起来简单,灵活,方便,中小型项目中用它比较方便,因为只需要@Transactional注解就OK了;这种方式用的就是spring框架自己提供的事务的处理机制,@Transactional注解的机制是AOP的环绕通知:在方法执行之前开启事务,方法执行之后回滚或者提交事务。@Transactional注解常见的属性包括:隔离级别、传播行为、超时时间以及回滚规则
2.使用 AspectJ 的 AOP 配置管理事务(掌握)
在大型项目中如何做事务的:
实现步骤: 都是在xml配置文件中实现。使用 XML 配置文件配置事务代理的方式的不足是,每个目标类都需要配置事务代理。当目标类较多,配置文件会变得非常臃肿。
使用 XML 配置文件的方式可以自动为每个符合切入点表达式的类和方法生成事务代理,使用aspectj框架功能,在spring配置文件中声明类和方法需要的事务。这种方式的业务方法和事务配置完全分离的,业务代码就是业务代码,事务就是事务。
二、总体思路:
1)你需要指定要使用的事务管理器实现类,使用<bean>
2)需要指定哪些类,哪些方法需要加入事务的功能
3)需要指定方法需要的隔离级别,传播行为,超时
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.5.RELEASE</version>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.2.5.RELEASE</version>
</dependency><dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.2.5.RELEASE</version>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.5.RELEASE</version>
</dependency> <dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.1</version>
</dependency> <dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency> <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
</dependency> <dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.12</version>
</dependency> 插件
<build>
<resources>
<resource>
<directory>src/main/java</directory><!--所在的目录-->
<includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources> <plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
spring框架中提供的事务处理方案:一共有两种:
- 适合中小项目使用的, 注解方案:
spring框架自己用aop实现给业务方法增加事务的功能, 使用@Transactional注解增加事务,@Transactional注解的机制是AOP的环绕通知:在方法执行之前开启事务,方法执行之后回滚或者提交事务:
- @Transactional注解是spring框架自己的注解,放在public方法的上面,表示当前方法具有事务。可以给注解的属性赋值,表示具体的隔离级别,传播行为,超时时间,异常信息等等
- @Transactional 若用在方法上,只能用于 public 方法上。对于其他非 public 方法,如果加上了注解@Transactional,虽然 Spring 不会报错,但不会将指定事务织入到该 方法中。因为 Spring 会忽略掉所有非 public 方法上的@Transaction 注解。
- 若@Transaction 注解在类上,则表示该类上所有的方法均将在执行时织入事务。
三、使用@Transactional的步骤:
1.声明事务管理器对象
在applicationContext.xml文件中声明事务管理器对象:
<bean id="xx" class="DataSourceTransactionManager">
(因为你是用的事务管理器的mybatis实现类)
事务管理器提交事务,回滚事务,但是它必须得知道连接哪一个数据库,数据库的信息 :
2.开启事务注解驱动:
告诉spring框架,我要使用注解的方式管理事务。
3.在业务方法上面加入@Trancational
rollbackFor:表示发生指定的异常时一定回滚
- Spring框架首先会检查方法抛出的异常是不是在rollbackFor的属性值中,如果异常在rollbackFor列表中,不管是什么类型的异常,一定会回滚;
- 如果你抛出的异常不在rollbackFor列表中,Spring会判断异常是不是RuntimeException,如果是一定回滚
- 总结:抛出指定异常或者是运行时异常都会回滚
四、使用 AspectJ 的 AOP 配置管理事务
1.加入aspectj 的依赖坐标:
1)要使用的是aspectj框架,在pom.xml文件中需要加入aspectj 的依赖坐标
<dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.2.5.RELEASE</version></dependency>
2.声明事务管理器对象:
在applicationContext.xml文件中声明事务管理器对象:
<bean id="xx" class="DataSourceTransactionManager">
(因为你是用的事务管理器的mybatis实现类)
3.配置业务方法的事务属性
- 声明方法需要的事务类型(配置方法的事务属性【隔离级别,传播行为,超时】)
你可以使用通配符,但是方法的命名需要有一定的规范,所有添加都是add开头 所有修改都是modify开头 所有删除都是remove开头...
4.配置切入点表达式:
指定哪些类需要用到事务:
5.配置增强器:
写的这些类得和那些需要用到事务的方法关联上: