背景
本文旨在介绍mysql数据库事务隔离级别以及快照读的原理,帮助读者快速理解。
MYSQL 事务隔离级别
常见概念
脏读
不可重复读
一次事务之中,同一条sql 的多次查询结果数据内容不一致
幻读
快照读
当前读
读未提交 ReadUncommit
读提交 ReadCommit (RC)
可重复读 RepeatableRead (RR)
MVCC 机制
定义
实现原理
mysql 的 innodb主键索引 中存储的数据列上默认的会包含三个字段,隐式的row_id, 当前事务 trx_id, 指向undo_log 的roll_pointer (回滚指针)
readview存储当前活跃事物的数组id,用于和trx_i比较来确定数据可读版本。
修改的事务id 小于数组中最小值的数据可读(意味着事务已经结束)
修改的事务id 大于数组中最大值的数据不可读(意味着事务在本事务之后生成)
修改的事务id 大于数组中最小值 且小于数值最大值的分两种情况
rc和rr级别下区别:前者在每次执行的读sql时,生成一个新的事务id数组,而后者只会在事物的第一个select时生成一个不变的事务数组。
MySQL锁类型
按加锁的对象和范围区分
表锁
行锁
间隙锁
下一行锁 (next-key-lock)
根据锁定是否共享