事务引入缘由: 并发情况下对数据库的连续操作进行管理。
重点目录:
- 事务特性(ACID): 原子性、一致性、隔离型、持久性
- 事务的隔离级别
- 事务的传播机制。
- @Transactional标签的使用
- @Transactional标签不作用 @Transaction不起作用解决方法
- 事务嵌套,项目示例异常: Transaction silently rolled back because it has been marked as rollback-only
Spring对事务管理源码解析:
public @interface Transactional {
//@AliasFor: 指定别名(及两者相同)。使用需求: 1. 成对出现。2.必须有默认值。3.属性和默认值类型必须相同
@AliasFor("transactionManager")
String value() default "";
@AliasFor("value")
String transactionManager() default "";
//事务传播方式
Propagation propagation() default Propagation.REQUIRED;
//事务隔离级别
Isolation isolation() default Isolation.DEFAULT;
//超时时间
int timeout() default TransactionDefinition.TIMEOUT_DEFAULT;
//是否只读
boolean readOnly() default false;
//指定异常类回滚
Class<? extends Throwable>[] rollbackFor() default {};
//指定异常类名回滚
String[] rollbackForClassName() default {};
//指定异常类不回滚
Class<? extends Throwable>[] noRollbackFor() default {};
//指定异常类名不回滚
String[] noRollbackForClassName() default {};
}
//事务传播方式
public enum Propagation {
// 需要事务。它是默认传播行为,如果当前存在事务,就沿用当前事务,否则新建一个事务运行子方法
REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED),
// 支持事务,如果当前存在事务,就沿用当前事务,如果不存在 ,则继续采用无事务的方式运行子方法
SUPPORTS(TransactionDefinition.PROPAGATION_SUPPORTS),
// 必须使用事务,如果当前没有事务,则会抛出异常,如果存在当前事务 ,就沿用当前事务
MANDATORY(TransactionDefinition.PROPAGATION_MANDATORY),
// 无论当前事务是否存在,都会创建新事务运行方法,这样新事务就可以拥有新的锁和隔离级别等特性,与当前事务相互独立
REQUIRES_NEW(TransactionDefinition.PROPAGATION_REQUIRES_NEW),
// 不支持事务,当前存在事务时,将挂起事务,运行方法
NOT_SUPPORTED(TransactionDefinition.PROPAGATION_NOT_SUPPORTED),
// 不支持事务,如果当前方法存在事务,则抛出异常,否则继续使用无事务机制运行
NEVER(TransactionDefinition.PROPAGATION_NEVER),
// 在当前方法调用子方法时,如果子方法发生异常,只因滚子方法执行过的 SQL,而不回滚当前方法的事务
NESTED(TransactionDefinition.PROPAGATION_NESTED);
private final int value;
Propagation(int value) { this.value = value; }
public int value() { return this.value; }
}
//事务隔离级别
public enum Isolation {
//使用数据库的隔离级别
DEFAULT(TransactionDefinition.ISOLATION_DEFAULT),
//读不提交
READ_UNCOMMITTED(TransactionDefinition.ISOLATION_READ_UNCOMMITTED),
//读提交
READ_COMMITTED(TransactionDefinition.ISOLATION_READ_COMMITTED),
//重复读
REPEATABLE_READ(TransactionDefinition.ISOLATION_REPEATABLE_READ),
//序列化
SERIALIZABLE(TransactionDefinition.ISOLATION_SERIALIZABLE);
private final int value;
Isolation(int value) {
this.value = value;
}
public int value() {
return this.value;
}
}
通过Spring中提供的事务源码,清晰的可以看到事务中的囊括点。
事务的实现方式:AOP。AOP的实现方式:动态代理。
(共同学习:https://blog.csdn.net/weixin_38289303/article/details/100058865、 https://blog.csdn.net/weixin_38289303/article/details/99908331)