不介绍概念,记录要点
mysql对acid的实现
隔离性的实现原理就是锁,因而隔离性也可以称为并发控制、锁等。
事务的隔离性要求每个读写事务的对象对其他事务的操作对象能互相分离。
原子性、一致性和持久性由数据库的 redo log 和 undo log 实现。
redo log 称为重做日志,用来保证事务的原子性和持久性,恢复提交事务修改的页操作。
undo log 来保证事务的一致性,undo 回滚行记录到某个特性版本及 MVCC 功能。两者内容不同。redo 记录物理日志,undo 是逻辑日志。
Innodb在RR级别如何避免幻读:
- 在快照读读情况下,mysql通过mvcc来避免幻读。
- 在当前读读情况下,mysql通过next-key来避免幻。
什么是next-key锁
行锁+GAP间隙锁
行级别锁的三种算法:
- Record lock
- Gap lock
- Next-Key lock
record lock 按照索引记录加锁,如果没有则采用隐式的主键来锁定。
next-key 结合了Gap lock 和 record lock ,例如索引值:10,11,13,20。则按next-key 锁定的区间为(-∞,10],(10,11]
,(11,13],(13,20],(20,+∞)
注意此处指非唯一索引,如果是唯一索引,会降级为Record lock ,仅仅锁住索引本身,而非范围。同时这种降级只发生在查询所有索引列的情况下,如果存在联合索引且只是查询联合索引的某一列,即属于range类型查询,仍是采用Next-key锁定,不会降级。
什么是快照读和当前读
快照读:简单的select操作,属于快照读,不加锁。
select * from table where ?;
当前读:特殊的读操作,插入/更新/删除操作,属于当前读,需要加锁。
select * from table where ? lock in share mode;
select * from table where ? for update;
insert into table values (…);
update table set ? where ?;
delete from table where ?;
参考:
https://www.jianshu.com/p/4e102e55d7de
https://www.cnblogs.com/fanguangdexiaoyuer/p/10759746.html
下边的文章真的很系统全面: