且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Spring的事务隔离级别与事务的传播性

更新时间:2022-10-02 20:33:01

事务的四大特性(ACID)

  1. 原子性(Atomicity): 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;
  2. 一致性(Consistency): 执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的;
  3. 隔离性(Isolation): 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;
  4. 持久性(Durability): 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。

Spring中事务的隔离级别

  spring没有事务和隔离级别的实现,主要是是依赖于具体数据库里的实现。
  我们知道Mysql的事务隔离级别有四种:读未提交,读已提交,可重复读,可串行化。
  TransactionDefinition类为我们定义了五个隔离级别:

  1. int ISOLATION_DEFAULT = -1;(默认)

    使用数据库的默认隔离级别,MySQL默认采用的REPEATABLE_READ隔离级别
  2. int ISOLATION_READ_UNCOMMITTED = 1;

    最低的隔离级别,允许读取,允许读取尚未提交的的数据变更,可能会导致脏读、幻读或不可重复读。
  3. int ISOLATION_READ_COMMITTED = 2;
    允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
  4. int ISOLATION_REPEATABLE_READ = 4;

对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。

  1. int ISOLATION_SERIALIZABLE = 8;

最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就说,该级别可以阻止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。

spring事务7种传播行为

事务的传播行为:

<font size=3 face="黑体">如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为。
通俗来说就是我们要执行一个事务了,但是这个事务在开始以前已经在另一个事务中了,</font>

TransactionDefinition类为我们定义了七个事务的传播行为:

  1. int PROPAGATION_REQUIRED = 0;

表示当前方法必须运行在事务中,支持当前事务,如果当前事务存在则会在当前事务中运行,如果当前事务不存在则新建一个新的事务。

  1. int PROPAGATION_SUPPORTS = 1;

支持当前事务,如果当前事务存在就运行在当前事务中,如果当前没有事务就以非事务的方式运行。

  1. int PROPAGATION_MANDATORY = 2;

支持当前事务,该方法且必须以事务的方式运行,如果当前事务存在就运行在当前事务中,如果当前事务不存在,就会抛出一个异常。

  1. int PROPAGATION_REQUIRES_NEW = 3;

表示必须运行在自己的事务中,如果当前事务存在就会把当前事务挂起,自己会新建事务。

  1. int PROPAGATION_NOT_SUPPORTED = 4;

使用非事务的方式运行,如果当前存在事务就把当前事务挂起。

  1. int PROPAGATION_NEVER = 5;

使用非事务的方式运行,如果当前存在事务,就抛出异常。

  1. int PROPAGATION_NESTED = 6;

表示如果当前存在一个事务,那么这个方法就会在嵌套事务中运行。嵌套事务可以独立于当前事务进行单独提交或者回滚,如果不存在就与PROPAGATION_REQUIRED 一样。