java后台

SpringBoot系列—事务管理(十三)

2019-09-26  本文已影响0人  海晨忆

个人博客:haichenyi.com。感谢关注

  我们操作数据库,事务管理是必不可少的一部分。

什么是事务

  我们在开发企业应用时,用户的一个操作对应数据库可能是多步操作相结合完成的。在这个多个步骤中,其中的一步,可能出现异常,导致后面的步骤无法向下进行,那么,用户的这个操作,可能就没有进行完,前面已经进行的步骤数据就需要回退。

举个总所周知的栗子:

  银行的转账,A给B转账,转1000块钱,A的钱需要扣1000,B的钱需要加1000,而,银行的系统在A扣1000块钱之后,B加1000块钱的时候,出现的异常,A的钱扣了,B的钱没有加,这该怎么办?这就需要用到我们的事务管理了。

  事务就是保证用户的每个操作都是可靠的,事务中的每一个步操作都必须成功执行,如果,其中某一个步骤出现了异常,那么就回退到事务开始未进行操作的状态。

  事务管理是Spring框架中最为常见的功能之一,我们在SpringBoot开发应用时,大部分情况下也需要使用事务。

事务管理操作步骤

  理论上就只有两步:

  1. @EnableTransactionManagement:标记在启动类
  2. @Transactional:标记的service层

  为什么说理论上只需要两步呢?因为,在SpringBoot中,当我们使用 spring-boot-starter-data-jdbc 或者是 spring-boot-starter-data-jpa 依赖的时候,框架会自动帮我们注入 入DataSourceTransactionManager 或者 JpaTransactionManager 。所以,我们不需要进行任何额外的配置,就直接可以使用 @Transactional 注解进行管理事务。

  还有几点需要注意的地方:

事务的隔离级别和传播行为

  除了指定事务管理器之后,还能对事务进行隔离级别和传播行为的控制,下面分别详细解释:

隔离级别

  隔离级别是指在发生并发的事务之间的隔离程度,与我们开发时候主要相关的场景包括:脏读、不可重复读、幻读。

  怎么避免上面的三种情况呢?我们可以看 org.springframework.transaction.annotation.Isolation 枚举类中定义了五个表示隔离级
别的值:

//指定方式:
@Transactional(isolation = Isolation.DEFAULT)

传播行为

  传播行为是指,如果在开始当前事务之前,已经存在一个事务,此时可以指定这个要开始的这个事务的执行行为。

  我们可以看 org.springframework.transaction.annotation.Propagation 枚举类中定义了6个表示传播行
为的枚举值:

//指定方式:
@Transactional(propagation = Propagation.REQUIRED)

  关于这个事务的隔离级别和传播行为,我们一般都不用特别的去指定,用默认的就行了,除非有特别的要求,默认的隔离级别和传播行为满足绝大多数要求。

上一篇 下一篇

猜你喜欢

热点阅读