likes
comments
collection
share

InnoDB中的锁(一)

作者站长头像
站长
· 阅读数 12

每逢并发,必讨论锁。锁的目的是为了保持一致性,不同的锁实现对性能影响也是差别很大的,比如MyISAM使用表锁,就会导致并发插入性能较低。

共享锁和排他锁

其实就是我们学的读锁和写锁

一致性非锁定读

InnoDB存储引擎通过行多版本控制(multi versioning)的方式来读取当前执行时间数据库中行的数据。当读取的行存在排他锁的时候,存储引擎会去读其对应的快照数据。

快照的实现是通过undo段来完成。而undo用来在事务中回滚数据,因此快照数据本身是没有额外的开销。此外,读取快照数据是不需要上锁的,因为没有事务需要对历史的数据进行修改操作。

快照数据是当前行数据的历史版本,一个行数据可以有很多历史版本,其中,当事务隔离级别是提交读时,非锁定读的是最新版本,当事务隔离级别是可重复读时,非锁定读的是事务开始时的行数据版本。

一致性锁定读

而对于一些情况,比如select For UPDATE的时候需要在读的时候也为其加锁。

自增长时锁的使用

Mysql5.1.22版本之前自增长的实现是通过表锁的AUTO-INCLocking方式。这种表锁为了尽可能的保证并发效率,会在插入成功后释放而不是等待事务完成。但其实并发插入性能依旧会受到影响,因此我们需要一种轻量级的自增长实现机制。

我们先将插入分类如下 InnoDB中的锁(一)

对于“simple inserts”,使用互斥量对内存中的计数器进行累加的操作。对于“bulk inserts”,还是使用AUTO-INCLocking。


4.11日更新,外键也需要在其母表添加对应的锁