mysql 的储存引擎、 事务、以及对MVCC的理解
通过 show engines可以查看MySQL所有的引擎
一、innoDB
Mysql5.5以后默认使用引擎,具有以下特性
- 灾难回复性好
- 支持事务
- 使用行级锁(table-level locking)
- 支持外键关联
- 支持热备份
二、MylSAM
MylSAM 特性如下:
- 不支持事务
- 使用表级锁(row-level locking),并发性能差
- 容易损坏,灾难性恢复差
- 不支持外键关联
三、事务(ACID)
可以理解为对数据的一系列操作,操作本身为一个整体,要么执行,要么不执行
事务具有以下几个特性:
- 原子性(
Atomicity
):事务执行的最小单位,不可分割,保障了事务的操作要么完成,要么失败。- 一致性 (
Consistency
):事务操作完成前后数据是一致的。- 隔离性(
Isolation
):并发访问数据库时,不同事务之间时互不干扰的。- 持久性(
Durability
):当事务提交以后,数据的改变是持久的。
四、事务的实现原理
MySQL InnoDB 引擎 使用 redo log (重要日志) 保证事务的持久性,使用undo log(回滚日志) 保证事务的原子性
通过 锁机制 MVCC 来保证事务的隔离性。(默认隔离级别为
REPEATABLE-READ
)在原子性、隔离性、持久性、得到保障之后,事务一致性才能得到保障
五、事务的并发问题
当数据库中的某一条数据被多个线程同时访问时,会引发以下几个问题:
脏读**(Dirty read)**:当一个事务访问数据库并修改了数据时,此时数据并未提交,当另一个事务操作数据库中的这条数据时
拿到的是并未提交的修改数据所引发的的问题即为脏读
幻读**(Phantom read)**:事务一读取数据同时事务二插入数据,再查询数据 时发现本不存在的数
不可重复读**(Unrepeatable read)**:事务一多次读取数据时,事务二访问并修改该数据,导致多次读取的数据不一致
数据丢失**(Lost to modify)**:事务一读取数据的同时,数据二也访问了该数据,两个事务同时对数据进行修改导致事务一
数据发生丢失 丢失
六、事务的隔离级别
- READ-UNCOMMITTED(读取未提交): 最低的事务级别,允许读取未提交的数
- READ-COMMITTED(读取已提交): 允许读取并发事务以提交的数据
- REPEATABLE-READ(可重复读): 对同一字段多次读取的数据是一致的
- SERIALIZABLE(可串行化): 最高的隔离级别,完全服从AICD的隔离级别,所有事务同步执行
七、对MVCC(Multi-Version Concurrency Control)的理解
多版本并发控制技术,是用用来控制并发的一种技术,一般使用在数据库的管理系统中,用来实现对数据库的并发
访问,可以根据事务的隔离情况去判断版本情况进行数据的并发,控制隔离。
可以从三种并发场景来进行解释:
- 读和读的并发
- 读和写的并发
- 写和写的并发
读和读不会造成任何并发问题
读写并发可能会对数据库造成隔离性问题,会出现脏读、幻读、以及不可重复读等问题
写和写的并发会造成数据丢失问题
mvcc 是可以解决这种并发安全问题的多版本并发控制技术,通过数据库中的隐式字段
undo 日志 和read view 来实现的 主要解决三个问题:
读写并发阻塞问题,提高数据库的并发处理能力
采用乐观锁,降低了死锁出现的概率
解决一致性读的问题,事务启动时根据某个条件读取数据,直到事务结束的时候再去执行相同的条件,
所读到的数据还是同一份数据,数据不会发生改变
使用MVCC时需要根据具体的业务场景来选择自由组合搭配乐观锁跟悲观锁,在这个两个组合中MVCC用来
解决读写冲突,乐观锁或者悲观锁用来解决写和写的冲突,最大程度的去提高数据的并发性能