Spring的隔离级别、事务特性等

内容复制于:https://blog.csdn.net/weixin_38070406/article/details/78157603

spring事务:
什么是事务:
事务逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败.

事务特性(4种):

  1. 原子性 (atomicity):强调事务的不可分割.
  2. 一致性 (consistency):事务的执行的前后数据的完整性保持一致.
  3. 隔离性 (isolation):一个事务执行的过程中,不应该受到其他事务的干扰
  4. 持久性(durability) :事务一旦结束,数据就持久到数据库

如果不考虑隔离性引发安全性问题:

  • 脏读 :一个事务读到了另一个事务的未提交的数据。例如B事务修改数据库X,在未提交前A事务读取了X的值,而B事务发生了回滚。
  • 不可重复读 :一个事务读到了另一个事务已经提交的 update 的数据导致多次查询结果不一致。例如A事务读取X,在中间过程中B事务修改了X的值,事务A再次读取X时值发生了改变。
  • 幻读 :一个事务读到了另一个事务已经提交的 insert 的数据导致多次查询结果不一致。例如A事务搜索数据时有10条数据,在这时B事务插入了一条数据,A事务再搜索时发现数据有11条了。

解决读问题: 设置事务隔离级别(5种)
DEFAULT 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.

  1. 未提交读(read uncommited) :脏读,不可重复读,虚读都有可能发生
  2. 已提交读 (read commited):避免脏读。但是不可重复读和虚读有可能发生
  3. 可重复读 (repeatable read) :避免脏读和不可重复读.但是虚读有可能发生.
  4. 串行化的 (serializable) :避免以上所有读问题.

Mysql 默认:可重复读
Oracle 默认:读已提交

Spring的隔离级别、事务特性等_第1张图片
read uncommited:是最低的事务隔离级别,它允许另外一个事务可以看到这个事务未提交的数据。
read commited:保证一个事物提交后才能被另外一个事务读取。另外一个事务不能读取该事物未提交的数据。
repeatable read:这种事务隔离级别可以防止脏读,不可重复读。但是可能会出现幻象读。它除了保证一个事务不能被另外一个事务读取未提交的数据之外还避免了以下情况产生(不可重复读)。
serializable:这是花费最高代价但最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读之外,还避免了幻象读(避免三种)。

事务的传播行为(传播特性)
PROPAGION_XXX :事务的传播行为

  • 保证同一个事务中
  1. PROPAGATION_REQUIRED 支持当前事务,如果不存在 就新建一个(默认)
  2. PROPAGATION_SUPPORTS 支持当前事务,如果不存在,就不使用事务
  3. PROPAGATION_MANDATORY 支持当前事务,如果不存在,抛出异常
  • 保证没有在同一个事务中
  1. PROPAGATION_REQUIRES_NEW 如果有事务存在,挂起当前事务,创建一个新的事务,也就是该传播级别每次执行都会创建新事务,并同时将上下文中的事务挂起,执行完当前线程后再恢复上下文中事务。(子事务的执行结果不影响父事务的执行和回滚)。
  2. PROPAGATION_NOT_SUPPORTED 以非事务方式运行,如果有事务存在,挂起当前事务
  3. PROPAGATION_NEVER 以非事务方式运行,如果有事务存在,抛出异常
  4. PROPAGATION_NESTED 如果当前事务存在,则嵌套事务执行

Spring事务传播和隔离级别配置

@Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class,timeout=1,isolation=Isolation.DEFAULT)

  1. 事务的传播性:@Transactional(propagation=Propagation.REQUIRED) 如果有事务, 那么加入事务, 没有的话新建一个(默认情况下)
  2. 事务的超时性:@Transactional(timeout=30) //默认是30秒
  3. 事务的隔离级别:@Transactional(isolation = Isolation.READ_UNCOMMITTED)
  4. 回滚:指定异常类:@Transactional(rollbackFor={RuntimeException.class, Exception.class})
  5. 只读:@Transactional(readOnly=true)该属性用于设置当前事务是否为只读事务,设置为true表示只读

你可能感兴趣的:(Spring)