更新时间:2022-10-02 20:33:01
spring没有事务和隔离级别的实现,主要是是依赖于具体数据库里的实现。
我们知道Mysql的事务隔离级别有四种:读未提交,读已提交,可重复读,可串行化。
TransactionDefinition类为我们定义了五个隔离级别:
int ISOLATION_DEFAULT = -1;(默认)
使用数据库的默认隔离级别,MySQL默认采用的REPEATABLE_READ隔离级别
int ISOLATION_READ_UNCOMMITTED = 1;
最低的隔离级别,允许读取,允许读取尚未提交的的数据变更,可能会导致脏读、幻读或不可重复读。
int ISOLATION_READ_COMMITTED = 2;
int ISOLATION_REPEATABLE_READ = 4;
对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
int ISOLATION_SERIALIZABLE = 8;
最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就说,该级别可以阻止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。
事务的传播行为:
<font size=3 face="黑体">如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为。
通俗来说就是我们要执行一个事务了,但是这个事务在开始以前已经在另一个事务中了,</font>
TransactionDefinition类为我们定义了七个事务的传播行为:
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;
表示如果当前存在一个事务,那么这个方法就会在嵌套事务中运行。嵌套事务可以独立于当前事务进行单独提交或者回滚,如果不存在就与PROPAGATION_REQUIRED 一样。