第二节 Springboot事务介绍

亮子 2022-02-18 03:46:39 10590 0 0 0

在springboot中事务的传播行为和隔离级别都是在TransactionDefinition这个接口中定义的。

1、SpringBoot事务的传播行为

传播行为定义了7种,分别用0-6来表示:

int PROPAGATION_REQUIRED = 0;
int PROPAGATION_SUPPORTS = 1;
int PROPAGATION_MANDATORY = 2;
int PROPAGATION_REQUIRES_NEW = 3;
int PROPAGATION_NOT_SUPPORTED = 4;
int PROPAGATION_NEVER = 5;
int PROPAGATION_NESTED = 6;

传播行为一共有7种,共分为2类。

传播行为分为两种:分为支持事物的传播和不支持事物的传播

1)、支持事务:

  • PROPAGATION_REQUIRED:如果当前没有事务,新建一个事务。如果当前有事务,则加入该事务。
  • PROPAGATION_SUPPORTS:如果当前有事务,则加入该事务。如果当前没有事务,已非事务运行。
  • PROPAGATION_MANDATORY:如果当前有事务,则加入该事务。如果当前没有事务,抛出异常。
  • PROPAGATION_REQUIRES_NEW:无论有没有事务都创建新事务。

2)、不支持事物

  • PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
  • PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
  • PROPAGATION_NESTED:(不支持事物)如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

spring与数据库事务本质上是一样的,spring是将数据库的事务进行封装。如果数据库没有事务,spring的事务是无效的。事务简单的来说就是提交、回滚和关闭三个操作。spring对数据库事务的封装原理就是拿一个数据连接,根据spring的事务配置,操作这个数据连接对数据库进行事务开启,回滚或关闭操作。

2、SpringBoot事务的隔离级别

隔离级别有4种:

int ISOLATION_DEFAULT = -1;//默认的隔离级别,使用数据库当前的隔离级别。会是后面四种隔离级别的其中一种
int ISOLATION_READ_UNCOMMITTED = 1;//读未提交;会有脏读,不可重复读,幻读发生
int ISOLATION_READ_COMMITTED = 2; //读已提交;会有不可重复读,幻读发生
int ISOLATION_REPEATABLE_READ = 4; //重复读;会有幻读出现
int ISOLATION_SERIALIZABLE = 8; //串行化

3、核心概念

  • 脏读

脏读(Dirty Reads):一个事务正在对一条记录做修改,在这个事务完成并提交前,这条记录的数据就处于不一致状态;这时,另一个事务也来读取同一条记录,如果不加控制,第二个事务读取了这些“脏”数据,并据此做进一步的处理,就会产生未提交的数据依赖关系。这种现象被形象地叫做“脏读”。

  • 不可重复读

不可重复读(Non-Repeatable Reads):一个事务在读取某些数据后的某个时间,再次读取以前读过的数据,却发现其读出的数据已经发生了改变或某些记录已经被删除了!这种现象就叫做“不可重复读”。

  • 幻读

幻读(Phantom Reads):一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为“幻读”。

4、SpringBoot事务属性的默认值

关于事务属性的默认值,对于springboot来说Transactional注解中定义的。我们可以在定义我们的事务的时候,根据实际需要修改这些属性值

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Transactional {
    @AliasFor("transactionManager")
    String value() default "";

    @AliasFor("value")
    String transactionManager() default "";

    String[] label() default {};

    Propagation propagation() default Propagation.REQUIRED;//默认的传播行为

    Isolation isolation() default Isolation.DEFAULT;//默认的隔离级别

    int timeout() default -1;

    String timeoutString() default "";

    boolean readOnly() default false;

    Class<? extends Throwable>[] rollbackFor() default {};

    String[] rollbackForClassName() default {};

    Class<? extends Throwable>[] noRollbackFor() default {};

    String[] noRollbackForClassName() default {};
}