文章目录
-
一、Spring 声明式事务 @Transactional
-
二、事务管理器
-
三、事务的隔离级别
-
- 脏读:一个事务 读到 另一个事务 没有提交的数据。
* 2.不可重复读:一个事务 读到 另一个事务 已经提交的数据(update更新语句)
* 3.虚度(幻读):一个事务 读到 另一个事务 已经提交的数据(insert插入语句)
- 脏读:一个事务 读到 另一个事务 没有提交的数据。
-
四、事务的传播行为
一、Spring 声明式事务 @Transactional
数据库事务属性都可以由注解@Transactional来配置的,这个注解可以标注在类或者方法上,当它标注在类上时,代表这个类所有公共( public )非静态的方法都将启用事务功能, 一般放在实现类上
@Tansactional 的配置项
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 1@Target({ElementType.TYPE, ElementType.METHOD})
2@Retention(RetentionPolicy.RUNTIME)
3@Inherited
4@Documented
5public @interface Transactional {
6 // 通过bean的name指定事务管理器
7 @AliasFor("transactionManager")
8 String value() default "";
9
10 // 同 value 属性
11 @AliasFor("value")
12 String transactionManager() default "";
13
14 // 指定传播行为
15 Propagation propagation() default Propagation.REQUIRED;
16
17 // 指定隔离级别
18 Isolation isolation() default Isolation.DEFAULT;
19
20 // 指定超时时间(单位秒)
21 int timeout() default -1;
22
23 // 是否只读事务
24 boolean readOnly() default false;
25
26 // 方法在发生指定异常时回滚,默认所有异常都回滚
27 Class<? extends Throwable>[] rollbackFor() default {};
28
29 // 方法在发生指定异常名称时回滚,默认所有异常都回滚
30 String[] rollbackForClassName() default {};
31
32 // 方法在发生指定异常时不回滚, 默认是所有异常都回滚
33 Class<? extends Throwable>[] noRollbackFor() default {};
34
35 // 方法在发生指定异常名称时不回滚,默认是所有异常都回滚
36 String[] noRollbackForClassName() default {};
37}
38
39
二、事务管理器
当我们使用了spring-boot-starter-jdbc或spring-boot-starter-data-jpa依赖的时候,框 架会自动默认分别注入DataSourceTransactionManager或JpaTransactionManager。所以我们不需要任何额外 配置就可以用@Transactional注解进行事务的使用, 当我们引入其他框架时,还会有其他的事务管理器的类
PlatformTransactionManager 接口
1
2
3
4
5
6
7 1public interface PlatformTransactionManager extends TransactionManager {
2 TransactionStatus getTransaction(@Nullable TransactionDefinition var1) throws TransactionException;
3 void commit(TransactionStatus var1) throws TransactionException;
4 void rollback(TransactionStatus var1) throws TransactionException;
5}
6
7
三、事务的隔离级别
数据库事务四个基本特征: 原子性,一致性,隔离性,持久性
四类隔离级别: 未提交读、读写提交、可重复读、串行化
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 事务机制中对数据库存在七种传播行为