Spring事务
事务(Transaction)是面向关系型数据库(RDBMS)企业应用程序的重要组成部分,用来确保数据的完整性和一致性。
事务了解 :MySQL学习记录 事务篇
Spring 实现声明式事务管理主要有 2 种方式:
- 基于 XML 方式的声明式事务管理
- 通过 Annotation 注解方式的事务管理
事务管理接口
Spring 的事务管理 :PlatformTransactionManager、TransactionDefinition 是事务主要核心接口
PlatformTransactionManager接口
该接口用于管理事务。其主要用于完成事务的提交、回滚,及获取事 务的状态信息
public interface PlatformTransactionManager extends TransactionManager {
TransactionStatus getTransaction(@Nullable TransactionDefinition var1) throws TransactionException;
void commit(TransactionStatus var1) throws TransactionException;
void rollback(TransactionStatus var1) throws TransactionException;
}
返回 | 抽象方法 | 说明 |
---|---|---|
TransactionStatus | getTransaction(@Nullable TransactionDefinition var1) | 获取事务的状态信息 |
void | commit(TransactionStatus var1) | 提交事务 |
void | rollback(TransactionStatus var1) | 回滚事务 |
TransactionDefinition接口
该接口主要获取事务相关信息的作用
public interface TransactionDefinition {
....
default int getPropagationBehavior() {
return 0;
}
default int getIsolationLevel() {
return -1;
}
default int getTimeout() {
return -1;
}
default boolean isReadOnly() {
return false;
}
@Nullable
default String getName() {
return null;
}
....
}
返回 | 抽象方法 | 说明 |
---|---|---|
int | getPropagationBehavior() | 获取事务的 传播行为 |
int | getIsolationLevel() | 获取事务的 隔离级别 |
int | getTimeout() | 获取事务的 超时时间 |
boolean | isReadOnly() | 获取事务是否 只读 |
String | getName() | 获取事务的 名称 |
属性说明
传播行为值 | 说明 |
---|---|
PROPAGATION_MANDATORY | 支持当前事务,如果不存在当前事务,则引发异常 |
PROPAGATION_NESTED | 如果当前事务存在,则在嵌套事务中执行 |
PROPAGATION_NEVER | 不支持当前事务,如果当前事务存在,则引发异常 |
PROPAGATION_NOT_SUPPORTED | 不支持当前事务,始终以非事务方式执行 |
PROPAGATION_REQUIRED | 默认传播行为,支持当前事务,如果不存在,则创建一个新的 |
PROPAGATION_REQUIRES_NEW | 创建新事务,如果已经存在事务则暂停当前事务 |
PROPAGATION_SUPPORTS | 支持当前事务,如果不存在事务,则以非事务方式执行 |
xml应用
主要配置组件(.xml)
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- <tx:method name="insert*" propagation="REQUIRED"/>-->
<!-- <tx:method name="add*" propagation="REQUIRED"/>-->
<!-- <tx:method name="find*" propagation="SUPPORTS" read-only="true"/>-->
<tx:method name="*" />
</tx:attributes>
</tx:advice>
<!-- aop编写,让Spring自动对目标生成代理,需要使用AspectJ的表达式 -->
<aop:config>
<aop:pointcut id="pt" expression="execution(* com.service..*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pt" />
</aop:config>
应用前提:
添加依赖
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.6</version>
</dependency>
实体类:(Student)
package com;
public class Student {
int id ;
String name;
int age;
public Student() {
}
public Student(int id , String name , int age) {
this.id = id;
this.name = name;
this.age = age;
}
public Student(String name , int age) {
this.name = name;
this.age = age;
}
public int getAge() {
return age;
}
public void setAge