innodb引擎特性
系统表空间:ibdata1 ibd 独立表空间,默认on
Doublewrite Buffer:物理文件 buffer 默认2M,记录脏页,顺序io能防止随机io在离散写时宕机发生的页断裂
Redolog:重做日志,事务持久性保证,能防止页断裂
undolog:事务原子性回滚的保证,逻辑日志,系统表空间物理buffer,实现多版本并发控制MVCC
bufferpool:LRU算法,最近最少使用,采用先进先出的队列设计容器是
change buffer:5.5之前是insert buffer,减少刷脏的io操作
原子性A | sql最小单元,一起成功,失败回滚rollback |
一致性C | 数据、状态一致 |
隔离性I | 并发访问可见性 |
持久性D | 永久保存 |
隔离性:脏读?不可重复读?幻读?
SQL92提出的解决方案并不能完全解决这类问题,利用锁的互斥性解决。
LBCC的当前读(时效要求高),行锁机制 select
MVVC的快照读 update、delete、insert
行锁:共享锁Share locks(S锁、读锁)解决不可重复读、排他锁Exclusive locks(X锁、写锁)
释锁 commit/rollback
innodb在索引项加锁实现,主辅索引都将锁定索引项,没索引锁就表锁
innodb行锁算法:基于索引
临键锁Next-key locks | 锁住命中记录区间和下一个区间(左开右闭) | type=range,innodb默认防止幻读 |
间隙锁Gap locks | 锁住索引检索记录不存在的区间(左开右开) | 合起来等同于临键锁 |
记录锁Record locks | 锁住等值匹配具体索引的索引项 |
MVCC :6byte数据行版本号trx_id、7byte删除版本号roll_ptr、6byte row_id(没主键,它做聚集索引)
快照读:事务版本号<=数据行版本号可新增修改(先删后加)、删除版本号>事务版本号或为NULL