文章目录
一、Spring 声明式事务 @Transactional
数据库事务属性都可以由注解@Transactional来配置的,这个注解可以标注在类或者方法上,当它标注在类上时,代表这个类所有公共( public )非静态的方法都将启用事务功能, 一般放在实现类上
@Tansactional 的配置项
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Transactional {
// 通过bean的name指定事务管理器
@AliasFor("transactionManager")
String value() default "";
// 同 value 属性
@AliasFor("value")
String transactionManager() default "";
// 指定传播行为
Propagation propagation() default Propagation.REQUIRED;
// 指定隔离级别
Isolation isolation() default Isolation.DEFAULT;
// 指定超时时间(单位秒)
int timeout() default -1;
// 是否只读事务
boolean readOnly() default false;
// 方法在发生指定异常时回滚,默认所有异常都回滚
Class<? extends Throwable>[] rollbackFor() default {};
// 方法在发生指定异常名称时回滚,默认所有异常都回滚
String[] rollbackForClassName() default {};
// 方法在发生指定异常时不回滚, 默认是所有异常都回滚
Class<? extends Throwable>[] noRollbackFor() default {};
// 方法在发生指定异常名称时不回滚,默认是所有异常都回滚
String[] noRollbackForClassName() default {};
}
二、事务管理器
当我们使用了spring-boot-starter-jdbc或spring-boot-starter-data-jpa依赖的时候,框 架会自动默认分别注入DataSourceTransactionManager或JpaTransactionManager。所以我们不需要任何额外 配置就可以用@Transactional注解进行事务的使用, 当我们引入其他框架时,还会有其他的事务管理器的类
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;
}
三、事务的隔离级别
数据库事务四个基本特征: 原子性,一致性,隔离性,持久性
四类隔离级别: 未提交读、读写提交、可重复读、串行化
1. 脏读:一个事务 读到 另一个事务 没有提交的数据。
2.不可重复读:一个事务 读到 另一个事务 已经提交的数据(update更新语句)
3.虚度(幻读):一个事务 读到 另一个事务 已经提交的数据(insert插入语句)
read uncommitted :
读未提交,一个事务 读到 另一个事务 没有提交的数据,存在问题3个,解决0个问题
read committed:
读已提交,一个事务 读到 另一个事务 已经提交的数据,存在问题2个,解决1个问题(脏读问题)
repeatable read:
可重复读,一个事务 读到重复的数据,即使另一个事务已经提交。存在问题1个,解决2个问题(脏读、不可重复读)
serializable:
串行化,同时只有一个事务可以操作,另一个事务挂起(暂停),存在问题0个,解决3个问题(脏读、不可重复读、虚读)
四、事务的传播行为
事务属性之7种传播行为
https://blog.csdn.net/soonfly/article/details/70305683
事务传播行为(propagation behavior)指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行。
例如:methodA事务方法调用methodB事务方法时,methodB是继续在调用者methodA的事务中运行呢,还是为自己开启一个新事务运行,这就是由methodB的事务传播行为决定的。
传播行为是方法之间调用事务采取的策略问题,
在一个批量任务执行的过程中,调用多个交易时,如果有一些交易发生异常,只是回滚那些出现异常的交易,而不是整个批量任务。
在spring中,当一个方法调用另外一个方法时,可以让事务采取不同的策略工作,在Spring 事务机制中对数据库存在七种传播行为