数据库知识(下)

关于数据库设计过程中的一些知识。

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锁。