MVCC
,全称Multi-Version Concurrency Control
,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。
从一个例子开始,两个客户端(c1,c2同时对一个表进行操作)同时连接数据库,同时关闭自动提交(set autocommit = 0)。
例1:同时开启事务(begin)->c1不做操作->c2更新表数据->c2提交(commit)->c1查询(结果为c2更新后数据)。
例2:同时开启事务(begin)->c1查询->c2更新表数据->c2提交(commit)->c1查询(结果为c2更新前数据)。
当前读:每次读取都读取最新的数据,触发当前读的操作update、delete、insert、select ... for update、select ... lock in share mode。
快照读:当事务开启后,每次进行select都会触发快照读。
首先了解下mysql的隐藏字段,DB_TRX_ID(当前事务id),DB_ROW_PTR(指向上一次事务记录的指针其实是上一条undolog的记录),DB_ROW_ID(随机唯一id)。其他为正常数据记录。
undolog属于是一个链表,链表的连接就是通过DB_ROLL_PTR指针进行连接,会记录每一次进行当前读操作的旧记录,便于回滚。
事务在进行快照读的时候产生readview简称读视图,其中共有三个主要字段TRX_LIST(当前活跃事务ID)、UP_LIMIT_ID(列表中最小的事务ID)、LOW_LIMIT_ID(系统尚未分配的下一个事务ID)
通过可见性算法即可推导出当前快照读的结果。
1、首先比较DB_TRX_ID < UP_LIMIT_ID,如果小于,则当前事务能看到DB_TRX_ID所在的记录,如果大于等于走下一个判断。
2、接下来判断DB_TRX_ID >= LOW_LIMIT_ID,如果大于等于则代表DB_TRX_ID所在的记录在read view生成后才出现,那么对于当前事务肯定不可见,如果小于,则进入下一个判断。
3、判断DB_TRX_ID是否在活跃事务中,如果在,则代表在read view生成时刻,这个事务还是活跃状态,还没有commit;,修改的数据,当前事务也是看不到,如果不在,则说明这个事务在read view生成之前就已经开始commit,那么修改的结果是能够看见的。
写不出来咋能说出来?以上仅为个人拙见,写出来加深记忆,错误之处欢迎大神指正!!