MySQL InnoDB锁和死锁

在使用MySQL的业务中,经常会碰到各种MySQL的死锁。一直以来,我们接触比较多的是Oracle数据库,而大家正在逐步开始使用MySQL数据库,都对MySQL的死锁不甚了解,趁这次机会,好好学习一下MySQL的死锁。我们的死锁的讨论是在InnoDB引擎基础上的。

1. MySQL索引

1.1 聚簇索引(Clustered Indexes)

InnoDB存储引擎的数据组织方式,是聚簇索引表:完整的记录,存储在主键索引中,通过主键索引,就可以获取记录所有的列。

每个InnoDB的表有一个特殊的索引称之为聚簇索引,每行的数据就是存储在聚簇索引中。通常,聚簇索引和主键同义。

当你在你的表上[......]

阅读全文

MySQL使用可重复读作为默认隔离级别的原因

一般的RDBMS系统,默认都会使用读提交(Read-Comitted,RC)作为默认隔离级别,如Oracle、SQL Server等,而MySQL却使用可重复读(Read-Repeatable,RR)。要知道,越高的隔离级别,能解决的数据一致性问题越多,理论上性能损耗更大,可并发性越低。隔离级别依次为:SERIALIZABLE > RR > RC > Read-Uncommited 在SQL标准中,前三种隔离级别分别解决了幻象读、不可重复读和脏读的问题。那么,为什么MySQL使用可重复读作为默认隔离级别呢?   1. 从Binlog说起 Binlog是MyS[......]

阅读全文

Oracle 10g/11g Latch机制的变化

Oracle 10g/11g Latch机制的变化:前面曾经提到,Oracle的Latch机制采用spin来进行持有CPU的不断尝试,虽然通常Latch的获取会非常快(一般在微秒级),但是很多时候Latch竞争还是会引发极为严重的CPU争用。所以从Oracle 10g开始,Oracle尝试引入一种新的机制来代替传统的Latch机制,这就是Mutex机制,也就是互斥机制。和Latch相比,一个Mutex Get大约仅需要30~35个指令,而Latch Get则需要大约150~200个指令,同时在大小上,每个Mutex仅占大约16Bytes空间,而Latch在10gR2中要占用大约112Bytes[......]

阅读全文