InnoDB存储引擎中的锁

我们知道,mysql常用的存储引擎是MyISAM和InnoDB,对于MyISAM引擎来说,只支持表锁,并发情况下的读一般都没问题,但对并发插入的性能就要差一些了。InnoDB引擎则支持行锁机制,在锁的粒度上可以更细,从而进一步提高并发插入的性能。

一,共享锁和排他锁的概念

InnoDB存储引擎实现了如下两种标准的行级锁:

1,共享锁 (S Lock), 允许事务读一行数据;

2,排他锁 (X Lock), 允许事务删除或者变更一行数据。

当一个事务已经获取了某行r的共享锁,那么另外的事务也可以立即获取该行r的共享锁而无需等之前的事务释放共享锁,因为读取操作并没有改变行r的数据,因此可以并行获取,此时称为锁兼容,若如果这时候有另外一个事务想获取行r的排他锁,则它必须等待之前事务释放行r上的共享锁,此时称为为锁不兼容。

下面总结一下共享锁和排他锁的兼容情况:

X S
X 冲突 冲突
S 冲突 兼容

结论:从上面的表格可以看出,若一个事务已经获取了某行r的排他锁,则其他事务均无法获取该行r的排他锁和共享锁;若一个事务已经获取了某行r的共享锁,则其他事务无法获取行r的排他锁,但可以立即获取对应行r的共享锁。


二,如何查看锁请求的信息

在InnoDb Plugin之前,我们只能通过如下命令查看:

mysql > show full processlist;

myslq > show engine innodb status;


在新的版本InnoDb Plugin后,我们可以通过查看数据字典information_schema下的三个表来获取事务,锁,锁等待的情况。对应的三张表是分别是:

1,information_schema.INNODB_TRX

2,information_schema.INNODB_LOCKS

3,information_schema.INNODB_WAITS

下面我们通过例子来分析这三张表。

todo,待续中...




你可能感兴趣的:(InnoDB)