关于数据库设计过程中的一些知识。
MyISAM与InnoDB关于锁方面的区别
MyISAM使用的是表级锁。
InnoDB默认使用的是行级锁和表级锁(只有通过索引检索数据时,才会使用行级锁)。
共享锁和排他锁
共享锁/读锁/S锁,多个事务只能读数据,可以加共享锁,不能加排他锁。
排他锁/写锁/X锁,其他事务不能再加锁。select from是普通查询没有锁机制。
乐观锁和悲观锁
悲观锁:数据库级的锁保证排他性,效率低。
乐观锁:在数据提交更新的时候对数据的冲突检测提交更新。
事务的四大特性
Atomic 原子性
Consistency 一致性
Isolation 隔离性
Durability 持久性
事务的隔离级别以及各级别下的并发访问问题
更新丢失:mysql所有的事务隔离级别都能实现。
脏读:事务A还未提交数据时,事务B使用了这个数据(RC避免)。
不可重复读:事务A读取数据过程中事务B改变数据,导致A操作的数据值不同(RR避免)。
幻读:事务B以插入或删除行的形式修改A查询的数据集(SERIALIZABLE避免)。
事务隔离级别由低到高:未提交读,已提交读(RC),可重复读(RR),串行化。
快照读和当前读
快照读:简单的select操作。
当前读(如下):
select * lock in share mode
select * for update
insert,update,delete
RC/RR级别下的快照读/非阻塞读
数据行里包括:1、最后一次修改的事务ID;2、回滚指针;3、行ID
undo日志:1、insert undo log;2、update undo log
read view:可见性判断,通过回滚指针指向的行ID取出之前的事务ID进行比较,保证获取的版本是当前最稳定的版本。
InnoDB在RR级别下避免幻读
表象:快照读(非阻塞读)–伪MVCC
内在:net-key锁。(行锁加gap锁)
gap锁的目的
防止同一事务的两次当前读出现幻读。
除了对唯一索引的唯一搜索外都会获取gap锁。