事务隔离级别和Spirng事务传播级别

事务的四个特性(ACID)

原子性

一个事务(transaction)中的全部操做,或者所有完成,或者所有不完成,不会结束在中间某个环节。事务在执行过程当中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务历来没有执行过同样。即,事务不可分割、不可约简mysql

隔离性

数据库容许多个并发事务同时对其数据进行读写修改的能力,隔离性能够防止多个事务并发执行时因为交叉执行而致使数据不一致。事务隔离分为不一样级别,包括读未提交(Read uncommitted)、读已提交(read committed)、可重复读(repeatable read)和串行化/序列化(Serializable)。sql

一致性

在事务开始以前和事务结束之后,数据库的完整性没有被破坏。这表示写入的资料必须彻底符合全部的预设约束、触发器、级联回滚等。数据库

持久性

事务处理结束后,对数据的修改就是永久的,即使系统故障也不会丢失。并发

事务的隔离级别

读未提交:read uncommited

  • 产生的问题:脏读、幻读、不可重复读
  • 解决的问题:null

读已提交:read commited

  • 产生的问题:幻读、不可重复读
  • 解决的问题:脏读

可重复读:repeatable read

  • 产生的问题:幻读
  • 解决的问题:脏读、不可重复读

串行化(序列化):serializable

  • 产生的问题:null
  • 解决的问题:All
  • 隔离级别最高,效率最低

脏读、幻读、不可重复读

1. 脏读

一个事务读到了另外一个事务未提交的数据(回滚)ui

2. 幻读

是不可重复读的一种特殊场景:当事务1两次执行SELECT ... WHERE检索必定范围内数据的操做中间,事务2在这个表中建立了(如INSERT)了一行新数据,这条新数据正好知足事务1的“WHERE”子句。事务

给人的感受就像出现了幻觉同样,以前明明不存在的数据,如今忽然出现了,被称为“幻读”。资源

3. 不可重复读

第一个事务两次“读取”过程当中,另外一个事务对一样的数据进行更新,第一个事务两次读取结果不一致,因此被称为“不可重复读”。it

数据库默认隔离级别

  1. mysql:repeatable read(可重复读
  2. Oracle:read commited(读已提交

事务的传播级别

  • MANDATORY:(mandatory:强制性) 以使用当前的事务,若是没有事务,抛出异常
  • REQUERS_NEW:(requers_new)新建一个事务,若是存在事务,则挂起以前的事务
  • REQUIRED:(required)(增删改)若是没有事务,则新建一个事务;若是事务,加入这个事务当中
  • NESTED:(nested:嵌套)事务,嵌套执行,没有事务,执行required
  • SUPPORTS:(supports)若是没有事务,非事务执行,若是事务,加入这个事务当中
  • NOT_SUPPORTED:(not_supported)必须非事务执行,若是事务,则挂起事务
  • NEVER:(never)非事务执行,若是存在事务,抛出异常

PS:io

  1. 文章来自各类资源的整理(部分原创),若有侵权请告知删除。
  2. 转载本文请注明出处
相关文章
相关标签/搜索