title: MYSQL(三)
date: 2020-06-21
categories:
- MYSQL
tags: - MYSQL
- InnoDB
- 数据库事务
- 锁
MYSQL索引
事务的四大特性原子性、持久性、隔离性是怎么实现的?一致性是怎么实现的?
原子性是利用InnoDB的undo.log
持久性是利用InnoDB的redo.log
隔离性是通过MVCC机制和锁,在事务隔离级别为读已提交(Read Commited)时,一个事务能够读到另一个事务已经提交的数据,
是不满足隔离性的。但是当事务隔离级别为可重复读(Repeateable Read)中,是满足隔离性的.
InnoDB 默认隔离幻读的原因是因为间隙锁(gaplock 只能在innoDB中使用),gap lock 阻塞插入,临键锁(nextkey lock)=间隙锁(gap lock)+记录锁(record lock) 此为锁的算法,只能在RR隔离级别中使用,RC中只能使用RecordLock。
注:RR RC MVCC(快照读)的区别:RR 建立快照的时间是第一次查询的时候 RC建立快照的时间是当前的查询;所以RC也有MVCC却不能解决幻读,但RR有MVCC可以解决幻读
一致性是通过原子性,持久性和隔离性来保证的.
事务并发带来的问题有哪些?四种事务隔离级分别是什么?InnoDB中事务隔离级别与事务并发的问题的关系是什么样的?
事务并发带来的问题有哪些
脏读(Dirty read)
当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作可能是不正确的
不可重复读(Unrepeatableread)
指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。
幻读(Phantom read)
幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。
不可重复度和幻读区别:
不可重复读的重点是修改,幻读的重点在 于新增或者删除。
四种事务隔离机制
读未提交(read uncommitted):可以读取其他 session 未提交的脏数据。
读已提交(read committed):允许不可重复读取,但不允许脏读取。提交后,其他会话可以看到提交的数据。
可重复读(repeatable read):禁止不可重复读取和脏读取、以及幻读(innodb 独有)。
串行(serializable):事务只能一个接着一个地执行,但不能并发执行。事务隔离级别最高。
InnoDB中事务隔离级别与事务并发的问题的关系是什么样的
RU | RC | RR | serializable | |
---|---|---|---|---|
脏读 | 不可解决 | 可解决 | 可解决 | 可解决 |
不可重复读 | 不可解决 | 不可解决 | 可解决 | 可解决 |
幻读 | 不可解决 | 不可解决 | 在InnoDB中可以解决 | 可解决 |
InnoDB中RR不会出现幻读的原因
RR级别(REPEATABLE-READ隔离级别)引入【next-key lock】避免幻读
next-key lock组成
record lock(记录锁)
gap lock(间隙锁)
gap lock应用场景
非唯一索引当前读
不走索引的当前读
仅命中部分结果的结果集当前读
主键索引或者唯一索引
如果where条件全部命中,则不会用gap lock锁,只会加record lock(记录锁)
如果where条件部分命中,则会用gap lock锁