文章目录
一、 Spring 事务管理简介
在 Spring 框架中事务管理有两种方式:一种是传统的编程式事务管理,即通过编写代码实现的事务管理;另一种是基于 AOP 技术实现的声明式事务管理。由于在 Spring 框架中,编程式事务管理很少使用,所以我们只对 Spring 的声明式事务管理进行详细讲解。
Spring 的声明式事务管理在底层采用了 AOP 技术,其最大的优点在于无须通过编程的方式管理事务,只需要在配置文件中进行相关的规则声明,就可以将事务规则应用到业务逻辑中。
Spring 实现声明式事务管理主要有两种方式:
- 基于 XML 文件方式的声明式事务管理。
- 通过 Annotation 注解方式的事务管理。
二、Spring 事务管理器
在 Spring 框架中提供了多种事务管理器来进行事务管理。Spring 的事务管理器是基于AOP 实现的。在 Spring 的事务管理器中包含了配置事务传播行为、隔离级别、只读和超时属性,这些属性提供了事务应用的方法和描述策略。
在 Java EE 项目开发经常会使用分层模式,Spring 的事务处理位于业务逻辑层,它提供了针对事务的解决方案。
1、Spring 事务管理接口
在 Spring 的事务模块(spring-tx-5.2.7.RELEASE.jar)中包括事务管理的三个核心接口。
1.1、 PlatformTransactionManager 接口
PlatformTransactionManager 接口是 Spring 提供的事务管理器接口,用于管理事务。Spring 将事务的配置详细信息封装到 TransactionDefinition 对象中,然后通过事务管理器的getTransaction() 方法获得事务的状态(TransactionStatus),并对事务进行下一步的操作。
该接口中提供了三个事务操作方法,具体如下:
1.2、 TransactionDefinition 接口
TransactionDefinition 接口是事务定义(描述)的对象,它提供了事务相关信息获取的方法,其中包括五个操作,具体如下:
1.3、 TransactionStatus 接口
TransactionStatus 接口是事务的状态,它描述了某一时间点上事务的状态信息。其中包括六个操作,具体如下:
2、Spring 中包含的事务管理器
三、 事务的传播行为
事务传播行为是指:多个含有事务的方法相互调用时,事务如何在这些方法间传播。
四、 Spring 声明式事务管理
Spring 声明式事务管理实现方式:
- 基于 XML 文件方式实现声明式事务管理。
- 通过 Annotation 注解方式实现声明式事务管理。
1、Jar 包依赖
Spring 核心容器模块:
spring-beans-5.2.7.RELEASE.jar
spring-context-5.2.7.RELEASE.jar
spring-core-5.2.7.RELEASE.jar
spring-expression-5.2.7.RELEASE.jar
Spring JDBC 模块:
spring-jdbc-5.2.7.RELEASE.jar
Spring 事务模块:
spring-tx-5.2.7.RELEASE.jar
Spring AOP 模块:
spring-aop-5.2.7.RELEASE.jar
AspectJ 框架:
aspectjweaver-1.9.5.jar
Spring 整合 AspectJ 框架模块:
spring-aspects-5.2.7.RELEASE.jar
Commons-Loggin 日志:
commons-logging-1.2.jar
数据库驱动:
mysql-connector-java-5.1.48.jar
2、使用 XML 文件方式实现声明式事务管理
2.1、 搭建环境
创建项目
创建实体类
public class Users {
private int userid;
private String username;
private String usersex;
public int getUserid() {
return userid;
}
public void setUserid(int userid) {
this.userid = userid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getUsersex() {
return usersex;
}
public void setUsersex(String usersex) {
this.usersex = usersex;
}
@Override
public String toString() {
return "Users{" +
"userid=" + userid +
", username='" + username + '\'' +
", usersex='" + usersex + '\'' +
'}';
}
}
public class Orders {
private int orderid;
private double orderprice;
public int getOrderid() {
return orderid;
}
public void setOrderid(int orderid) {
this.orderid = orderid;
}
public double getOrderprice() {