1.InnoDB&&MyISAM
1.1. InnoDB
- 支持事务,支持行级锁
- 走聚簇索引(叶子节点存数据,数据存储与索引放到了一块)
- 强制要求主键
- 支持外键关联
1.2. MyISAM
- 不支持事务,不支持行级锁
- 是非聚簇索引(叶子节点存指针)
- 不支持外键约束
2.隔离级别
-
读未提交
-
读已提交(不可重复读)
现象: 一个事务A中2次读取一条记录,记录不一致(被其他事务修改) -
可重复度
实现:mvcc机制(多版本并发控制):
innodb存储引擎,会在每行数据的最后加两个隐藏列,一个保存行的创建时间,一个保存行的删除时间,但是这儿存放的不是时间,而是事务id,事务id是mysql自己维护的自增的,全局唯一。在一个事务内查询的时候,mysql只会查询创建 当前事务id>=创建事务id ,当前事务id < 删除事务id
某个事务执行期间,别的事务更新了一条数据:其实是在innodb中插入了一行记录,然后将新插入的记录的创建时间设置为新的事务的id,同时将这条记录之前的那个版本的删除时间设置为新的事务的id。
-
串行化(解决幻读)
幻读:一个事务内多次读取,记录数不一样;不可重复读和可重复读都是针对两个事务同时对某条数据在修改,但是幻读针对的是插入。
幻读会带来的问题:事务A要插入一条数据,先查询一下有没有相同的数据,但是这时事务B添加了这条数据,这就会导致事务A插入失败,并且它就算在自己事务内再一次查询,也无法查询到与其插入相冲突的数据,同时自身死活都插入不了