目 录CONTENT

文章目录

事务

gsh456
2024-04-29 / 0 评论 / 0 点赞 / 23 阅读 / 0 字

1. springBoot 事务传播级别

Spring Boot中的事务传播级别主要用于解决方法调用时事务的合并问题。事务传播级别定义了当事务方法被另一个事务方法调用时,如何传播该事务。

Spring支持的事务传播级别包括:

  1. REQUIRED(默认):如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。

  2. SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。

  3. MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。

  4. REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则挂起当前事务。

  5. NOT_SUPPORTED:以非事务的方式运行,如果当前存在事务,则挂起当前事务。

  6. NEVER:以非事务的方式运行,如果当前存在事务,则抛出异常。

  7. NESTED:如果当前存在事务,则在嵌套事务中执行;如果当前没有事务,则创建一个新的事务。

2. 事务隔离级别分为四种(级别递增):

1、Read Uncommitted(读未提交) :事务中的修改,即使没有提交,其他事务也可以看得到,会导致“脏读”、“幻读”和“不可重复读取”;

2、Read Committed (读已提交):大多数主流数据库的默认事务等级,保证了一个事务不会读到另一个并行事务已修改但未提交的数据,避免了“脏读取”,但不能避免“幻读”和“不可重复读取”。该级别适用于大多数系统。

3、Repeatable Read(可重复读) :保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据。避免了“脏读取”和“不可重复读取”的情况,但不能避免“幻读”,但是带来了更多的性能损失。

4、Serializable (串行化):最严格的级别,事务串行执行,资源消耗最大;

注解配置时如:@Transactional(isolation = Isolation.READ_UNCOMMITTED)

可重复读(repeatable-read):在开始读取数据(事务开启)时,不再允许修改操作

mysql默认的事务隔离级别为repeatable-read(可重复读)

脏读、不可重复读和幻读的解释:

事务并发导致的这些问题。

脏读:事务A读取了事务B更新的数据,然后事务B进行回滚操作,那么事务A读取到的数据是脏数据;

不可重复读:事务A多次读取同一数据,事务B在事务A多次读取的过程中,对数据进行了更新操作,导致事务A多次读取同一数据时,结果不一致;

幻读:事务A修改一些数据,事务B在这个时候插入了一条数据,事务A修改之后发现还有一条没有修改过来,好像发生幻觉一样,这就是幻读。

不可重复读和幻读很相似,但侧重点不同,不可重复读侧重于修改幻读侧重于新增或者删除。解决不可重复读只需要锁住满足条件的行,解决幻读需要锁住表。

3. ACID

springBoot 事务 acid

Spring Boot 支持使用注解来管理事务,以确保它们满足ACID(原子性、一致性、隔离性、持久性)事务的特性。

  1. 原子性(Atomicity):一个事务要么全部完成,要么完全不做。

  2. 一致性(Consistency):事务应确保数据从一个一致的状态转换到另一个一致的状态。

  3. 隔离性(Isolation):事务应相互独立,不会互相影响。

  4. 持久性(Durability):一旦事务提交,其结果必须永久保存。

在Spring Boot中,你可以使用@Transactional注解来声明一个方法应该在事务的上下文中执行。以下是一个简单的例子:

0

评论区