1.Myisam支持的是表级锁,Innodb支持的是行级锁
2.lock latch
在数据库中,这2个都叫做锁,然而却有着截然不同的含义
3.在innodb中有2种行级锁
共享锁:允许事务读一行数据
排他锁:允许事务删除或更新一行数据
很容易理解,当一行数据被排它锁锁住时,是不允许其他任何事务再去获取这行数据的任务锁的
然而当一行数据被共享锁锁住时,是允许其他事务再去获取这行数据的共享锁的,因为读不会修改中这行的数据,这称为锁兼 容。
4.一致性非锁定读:就是当读取的行正在进行update或者delete操作时,此时读操作不会等着行锁的释放,而是去获取快照数据,快照数据是undo段实现的。然而读取的版本快照数据因隔离方式的不同而不同。
读已提交:读取的是最新版本的快照数据
可重复读:读取的是事务开始时的快照版本数据
5.支持显式的一致性锁定读
select … for update; 在该行获取一个排他锁
select … lock in shard mode; 在该行获取一个共享锁
当事务提交或回滚后,该锁也就被释放了
6.我们都知道 事务遵循ACID,也就是原子性,一致性,隔离性,持久性
隔离机制:
读未提交:会产生脏读
读已提交:解决了脏读,会出现不可重复读,是oracle的默认隔离方式
可重复读:innodb默认的隔离方式,使用Next_Key Lcok的方式避免了不可重复读的现象,在Next_Key Lcok算法下,对于索引的扫描,不仅是锁住扫描到的索引,而且还锁住这些索引覆盖的范围,因此在这个范围的插入更新都是不允许的,这样就避免了另外的事务在这个范围内插入更新数据导致的不可重复读的问题。
串行读: 不用多说,效率很低
所谓脏读:事务A可以读到事务B未提交的数据,跟脏页是不一样的,脏页是在缓冲池中被修改的页,即使还没有被刷到磁盘中,日志已经写到了undo日志中,只是因为内存和磁盘的异步造成的,是最终一致性。
所谓不可重复读:事务A第一次读到数据后,事务B修改了该行数据,事务A再次读取该行数据,发现与第一次读取到的数据不一样,违反了事务的隔离性。