Spring boot 事务管理

释放双眼,带上耳机,听听看~!

文章目录

  • 一、Spring 声明式事务 @Transactional

  • 二、事务管理器

  • 三、事务的隔离级别

    1. 脏读:一个事务 读到 另一个事务 没有提交的数据。
      * 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注解进行事务的使用, 当我们引入其他框架时,还会有其他的事务管理器的类
Spring boot 事务管理
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. 脏读:一个事务 读到 另一个事务 没有提交的数据。

Spring boot 事务管理

2.不可重复读:一个事务 读到 另一个事务 已经提交的数据(update更新语句)

Spring boot 事务管理

3.虚度(幻读):一个事务 读到 另一个事务 已经提交的数据(insert插入语句)

Spring boot 事务管理

read uncommitted :
读未提交,一个事务 读到 另一个事务 没有提交的数据,存在问题3个,解决0个问题

read committed:
读已提交,一个事务 读到 另一个事务 已经提交的数据,存在问题2个,解决1个问题(脏读问题)

repeatable read:
可重复读,一个事务 读到重复的数据,即使另一个事务已经提交。存在问题1个,解决2个问题(脏读、不可重复读)

serializable:
串行化,同时只有一个事务可以操作,另一个事务挂起(暂停),存在问题0个,解决3个问题(脏读、不可重复读、虚读)

Spring boot 事务管理

四、事务的传播行为

事务属性之7种传播行为
https://blog.csdn.net/soonfly/article/details/70305683

事务传播行为(propagation behavior)指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行。
例如:methodA事务方法调用methodB事务方法时,methodB是继续在调用者methodA的事务中运行呢,还是为自己开启一个新事务运行,这就是由methodB的事务传播行为决定的。

传播行为是方法之间调用事务采取的策略问题,
在一个批量任务执行的过程中,调用多个交易时,如果有一些交易发生异常,只是回滚那些出现异常的交易,而不是整个批量任务。

在spring中,当一个方法调用另外一个方法时,可以让事务采取不同的策略工作,在Spring 事务机制中对数据库存在七种传播行为

给TA打赏
共{{data.count}}人
人已打赏
安全技术

c++ list, vector, map, set 区别与用法比较

2022-1-11 12:36:11

安全经验

外媒解读Web安全核心PKI的四大致命问题

2016-12-24 20:36:45

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索