目录与学习目标

  1. 1:事务到底有多重要
  2. 2:事务的ACID
  3. 3:隔离性讲解
  4. 1:隔离性概念
  5. 2:案例讲解(从结果看结论)
  6. 3MySQLOracle的默认隔离级别
  7. 3:持久性 原子性 一致性讲解

1:事务到底有多重要

  1. 我们上文讲述了数据库是存储数据的一个容器,而这个容器的数据会不断的变化以及使用,
  2. 而为保证容器中的数据变化以及使用都是正常的,使用的正是事务的相关机制。

2:事务的ACID

  1. ACID,是指数据库管理系统(DBMS)在写入或更新资料的过程中,为保证事务(transaction)是正确可靠的,
  2. 所必须具备的四个特性:原子性(atomicity,或称不可分割性)、一致性(consistency)、隔离性(isolation,又称独立性)、持久性(durability)。
  3. 事务是逻辑上的一组操作,要么执行要么不执行;
  4. 事务的四大特征ACID
  5. 1:原子性:要么全部完成,要么全部不起作用;
  6. 2:一致性:执行事务前后,事务保持一致,多个事务对一个数据的读取结果相同;
  7. 3:隔离性:并发访问数据库时,各个并发事务之间数据库是独立的;
  8. 4:持久性:事务被提交后,对数据库的数据改变是持久的

3:隔离性讲解

1:隔离性概念

  1. 讲隔离性之前我们先来了解MVCC中的间隙锁:
  2. 间隙锁: 间隙范围内 全部事务都可以读 但只有本事务可以写
  3. 间隙范围:不仅仅是本事务的查询访问 还包括了数据区间访

  1. 针对于并发事务,由于隔离级别可能会导致以下问题
  2. READ-UNCOMMITTED(读未提交)
  3. 脏读(Dirty read):
  4. 读了未提交的数据;
  5. READ-COMMITTED(读已提交)
  6. 不可重复读(Unrepeatableread):
  7. 事务一:第一次和第二次读取的某数据的时间间隙
  8. 事务二:对该数据 进行了修改

  1. REPEATABLE-READ(可重复读)
  2. 幻读(Phantom read):
  3. 事务一:第一次和第二次 读取的某类数据的总量(新增或者删除数据)的时间间隙
  4. 事务二:对该类 数据进行了插入或者删除
  5. 使用MVCC机制解决不可重复读问题,在写的时候加间隙锁。

  1. SERIALIZABLE(可串行化)
  2. 读写操作都加了间隙锁,导致针对数据操作的互斥性,来保证事务的串行化。

  1. 不可重复读的重点是修改。
  2. 幻读的重点在于新增或者删除了数据,导致同一个事物前后两次读取的总量不一致

2:案例讲解(从结果看结论)

image.png

  1. 读未提交:V1 V2 V3 2
  2. 读已提交:V1 =1 V2 = 2 V3 = 2
  3. 可重复读:V1 = 1 V2 = 1 (同一个事务内的一致性) V3 = 2
  4. 串行化:会通过对受影响的行加 读写锁的方式保证一致性,读写锁冲突,则必须等前一个锁被解除才能执行。
  5. V1 = 1 V2 = 1 (这个时候读写锁冲突) V3 = 2
  6. 读未提交:一个事务还没提交时,它做的变更就能被别的事务看到。
  7. 读已提交:一个事务提交之后,它做的变更才会被其他事务看到。(通过可重复读中 给该数据 加读写锁 解决)
  8. 可重复读:一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。
  9. 串行化:顾名思义是对于同一行记录,只要影响了该行数据 (如select * from table_name where id >0
  10. “读”会加“读锁”,“写”会加“写锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。

3:MySQL与Oracle的默认隔离级别

  1. MySQL数据库的默认隔离级别: REPEATABLE-READ(可重复读)
  2. 查询其隔离级别:SELECT @@tx_isolation
  3. 注意:
  4. 以上是MySQL使用InnDB存储引擎的情况下,因为MyISAM的存储引擎仅有表级锁,是不支持行级锁的。
  5. SQL 标准不同的地方在于InnoDB 存储引擎在 REPEATABLE-READ(可重复读)事务隔离级别下使用的是Next-Key Lock 锁(间隙锁)算法,因此可以避免幻读的产生。

  1. Oracle数据库的默认隔离级别:READ-COMMITTED(读已提交)
  2. 没有SQL可直接查询出其隔离级别,仅能使用SQL进行测试。
  3. 注意:
  4. Oracle没有存储引擎的概念,而有另一个概念:联机事务处理OLTPon-line transaction processing)、联机分析处理OLAPOn-Line Analytical Processing
  5. 后面会进行讲解。

3:持久性 原子性 一致性讲解

  1. 持久性正是保证了我们数据库的数据可以长期记录的特性。
  2. 原子性与一致性,实际上概念的确是有一些模糊不清的,
  3. 我们可以理解成:
  4. 原子性的执行过程导致了一致性的结果,前者为过程,后者为结果,
  5. 最终的目标是达到了:事务是逻辑上的一组操作,要么执行要么不执行。