事务特性及隔离级别

一、事务特性

  事务的机制通常被概括为“ACID”原则即原子性(A)、稳定性(C)、隔离性(I)和持久性(D)。

  • 原子性(Atomicity):构成事务的的所有操作必须是一个逻辑单元,要么全部执行,要么全部不执行。
  • 一致性(Consistency):数据库在事务执行前后状态都必须是稳定的。有非法数据(外键约束之类),事务撤回。如果数据库系统运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是不一致的状态。一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。
  • 隔离性(Isolation):事务之间不会相互影响。
  • 持久性(Durability):事务执行成功后必须全部写入磁盘。

二、事务隔离级别

  首先说一下事务隔离级别相关的几个概念。

  1. 脏读:指在一个事务处理过程里读取了另一个未提交的事务中的数据。
  2. 不可重复读:指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。
  3. 虚读(幻读) :第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

事务隔离级别

  1. read-uncommitted 读未提交: 两个事务,其中一个事务对数据做的DML操作还未提交,另一个事务能够立即看到。
  2. read-committed 读已提交两个事务,其中一个事务对数据做的DML操作提交后,另一个事务才能看到。
  3. repeatable-read 可重复读:两个事务,其中事务A获取一条数据,事务B在事务A提交事务前无法操作这条数据,这样就保证了可以重复
  4. serierlized 串行化:两个事务完全独立,其中一个事务做的操作,对于另外一个事务不产生任何影响。【数据库事务加了锁,所有事务串行执行】。

隔离级别对应的问题,对号代表可能出现。

原文地址:https://www.cnblogs.com/robertsun/p/7930189.html