针对MySql知识的回顾
MySql虽然是一个相对简单的关系型数据库,但也是一个最常用的数据库,也是一个非常经典的数据库,很多云产品也是基于MySql做了二开,从而变得非常强大,其中MySql最常用的是Innodb引擎,因为该引擎支持事务,行级锁等特性,从而使其非常适用于业务开发的场景。
MySql的知识体系其实很庞大,真要完全吃透其实非常复杂,而且很多知识点也容易忘记或者没理解透,但是,想要用好MySql就必须加强对它相关知识的记忆,其实很多人都或多或少见过这些知识点,甚至曾经也都记得,但是当一段时间过去,可能对这些知识点又产生了一层朦胧,本人亦如此,现在,将展开对此回顾:
在Innodb中:
当在RC和RR的isolation下,凡是SELECT xx FROM xx (WHERE xx)是快照读,不加任何锁,而只要是添加S锁或者X锁,都会产生当前读,凡是不生产锁的就是快照读,产生的锁的都是当前读;
RU/SERIALIZE的isolution下全部使用当前读,其中串行化级别下的普通SELECT都会默认在尾部追加S锁以此来实现当前读。
RC 和 RR 隔离级别都是由 MVCC 实现,区别在于:
- RC 隔离级别时,read-view 是每次执行 select 语句时都生成一个;
- RR 隔离级别时,read-view 是在第一次执行 select 语句时生成一个。
需要注意的是...IN SHARE MODE、...FOR UPDATE、INSERT、UPDATE、DELETE等触发锁的行为一定要走索引,不然会导致锁表,其实范围查询时若命中纪录为空,这种情况即使走索引列也会认为未走索引而锁表