事务隔离是为了解决事务并发的读一致性问题?如何保证在一个事务里多次读到的数据一样?
- 基于锁的并发控制(LOCK BASED CONCURRENCY CONTROL)
- 生成一致性数据快照(snapshot),这个叫(multi version concurrency control>,简称MVCC
两个行级别的锁:
- 共享锁(读锁)LOCK IN SHARE MODE
- 排他锁(写锁)。delete, update, insert自动加入排他锁。如果主动加,关键字是 FOR UPDATE。一个事务获得了排他锁其他事务就不能获得了
两个表级别的锁:
- 意向共享锁:数据引擎自己维护的,用户没有办法自己操作。给某行加共享锁,必须先对表加意向排他锁
- 意向排他锁:给某行加共享锁,必须先对表加意向排他锁
事务给某张表加上表锁的前提:没有任何其他事务已经锁定了任意一行数据.所以意向锁的用处是为了提高加表锁的检查效率
一个表只能有一个聚集索引!!
聚集索引:索引的逻辑顺序 = 数据物理顺序
- 如果定义了PRIMARY KEY, 那主键索引就是聚集索引
- 如果没有主键索引,那么第一个UNIQUE KEY会被用作聚集索引
- 如果都没有,那么会用_rowid建立为聚集索引
聚集索引:叶子节点存储索引和数据
二级索引:叶子节点存储索引和主键
锁的作用:锁锁的是索引项
- 表没有索引,为什么会锁表?
涉及到全表扫描 - 表既有PRIMARY KEY, 又有UNIQUE KEY
PRIMARY KEY是聚集索引,UNIQUE KEY不是聚集索引,是二级索引。
记录锁:
唯一性索引等值查询,并且检索到了
select * from orders where order_num = 3 for update;
间隙锁:
检索到间隙上去了(不存在数据).间隙排他锁是不冲突的(反正都检索不到数据).
间隙锁的作用是,阻塞插入间隙
临键锁:
范围查询既包含记录,又包含间隙.
会锁定多个区间.
innodb用临键锁使得可重复读,不会出现幻读问题