Mysql事务、锁和MVCC
本文最后更新于:10 天前
Mysql事务、锁和MVCC”
1、事务
1.1目的
保证数据最终的一致性
1.2特性
ACID
原子性(Atomicity)
要么同时成功,要么同时失败,底层依赖undo log
实现
隔离性(Isolation)
事务之间需要有隔离,互不影响。Mysql提供四种隔离级别,隔离级别底层实现是锁
四种隔离级别:
- read uncommit (读未提交)
- read commit (读已提交)
- repeatable read (可重复复读)
- serializable (串行)
持久性(Durability)
一旦提交事务,数据永久记录。Mysql底层使用redo log
来持久化数据。
一致性(Consistency)
一致性是事务的目的,需要通过应用程序来保证一致性
「隔离性」「原子性」「持久性」均是为了保障「一致性」的手段
2、锁
在 InnoDB 引擎下,按锁的粒度分类,可以简单分为行锁
和表锁
- 命中索引是行锁,不命中是表锁
- 行锁实际上是作用在索引之上的
- 行锁又可以简单分为读锁(共享锁、S 锁)和写锁(排它锁、X 锁)
- 读锁是共享的,多个事务可以同时读取同一个资源,但不允许其他事务修改
- 写锁是排他的,写锁会阻塞其他的写锁和读锁
3、MVCC
MVCC 的主要是通过 read view
和 undo log
来实现的
待整理…
总结:
- 事务为了保证数据的最终一致性
- 事务有四大特性,分别是原子性、一致性、隔离性、持久性
- 原子性由 undo log 保证
- 持久性由 redo log 保证
- 隔离性由数据库隔离级别供我们选择,分别有 read uncommit,read commit,repeatable read,serializable
- 一致性是事务的目的,一致性由应用程序来保证
- 事务并发会存在各种问题,分别有脏读、重复读、幻读问题。上面的不同隔离级别可以解决掉由于并发事务所造成的问题,而隔离级别实际上就是由 MySQL 锁来实现的
- 频繁加锁会导致数据库性能低下,引入了 MVCC 多版本控制来实现读写不阻塞,提高数据库性能
- MVCC 原理即通过 read view 以及 undo log 来实现
Mysql事务、锁和MVCC
https://calmchen.com/posts/c058a5a3.html