MCC是什么?
(multiversion concurrency control:多版本并发控制)
并发访问数据库时,对事务中的数据进行多版本控制,以解决在一个事务中写,另外一个事务可以读的问题
如
--例子1
--会话1
set SESSION autocommit = off;
update users set lastUpdate = NOW() where id = 1;
--会话2
select * from users where id > 1;--可以查出结果
select * from users where id = 1;--可以查出结果,是更新前的值 来自于快照
例子2
--会话1
BEGIN
SELECT * FROM users where id = 1;
SELECT * FROM users where id = 1; --来自于快照,是更新前的值
--会话2
BEGIN
update users set lastUpdate = NOW() where id = 1;
增删改对db_trx_id和db_roll_pt
db_trx_id和db_roll_pt的简介
db_trx_id:数据行的版本号
db_roll_pt:删除版本号
两者的区别:
相同点:取当前会话的事务id
不同点:db_trx_id是新增时插入,db_roll_pt是删除时插入,而修改是采用先新增后删除的操作,所以两个都需要改变
具体例子
插入
db_trx_id取当前的会话的事务id
![](https://img.haomeiwen.com/i5359801/44a6b17625049830.png)
删除
db_roll_pt取当前的会话的事务id
![](https://img.haomeiwen.com/i5359801/106ca249d3e618e1.png)
修改
删除旧记录,新增旧记录的copy
![](https://img.haomeiwen.com/i5359801/ba6c375c90c14b92.png)
查询的使用
查询规则
1 db_trx_id:版本号<=当前事务,从而保证别的事务新增的数据不会对当前事务有影响
2 db_roll_pt:NULL或者版本号>当前事务,从而保证别的事务对数据进行删除和修改操作对当前事务不会产生影响。
例子
![](https://img.haomeiwen.com/i5359801/8ae9db1d27429f1a.png)
MVCC例子
--数据准备
insert into teacher(name,age) value('seven',18);
insert into teacher(name,age) value('qing',20);
-- tx1
BEGIN -- 1
select * from users; -- 2
COMMIT
-- tx2
BEGIN -- 3
update teacher set age = 28 where id = 3;-- 4
COMMIT;
例子1:执行顺序:1,2,3,4,2
1,2执行完的结果:
![](https://img.haomeiwen.com/i5359801/8460d36780fa28cc.png)
3,4再次查询的结果:
![](https://img.haomeiwen.com/i5359801/10a43c918cc643fc.png)
符合mvcc的条件
例子2:执行顺序:3,4,1,2
执行结果是
![](https://img.haomeiwen.com/i5359801/87cadd2c06e8a22f.png)
但按照mvcc的分析是id=3的age值应该是28,是有问题的,原因是先更新后查询走的是快照读
网友评论