MySql innodb的锁

来源:互联网 发布:ug10钻孔编程 编辑:程序博客网 时间:2024/05/20 00:10

MySql innodb中的索引添加到索引上,提供了更细粒度的锁机制。提高并发性能。

Innodb中默认的索引是Next-Key。锁定的不是单个值,而是一个范围。

innodb依据索引的不同会添加不同的锁。

举例:
delete from t1 where id = 10;

Read Commited(X锁:互斥锁)

当id是主键索引时

当id=主键时,此SQL只需要在id=10这条记录上添加X锁即可。

id=唯一索引

由于id不是主键,而是一个Unique的二级索引值,首先将索引unique id加X锁,同时读取主键索引,在主键索引上加X锁。(避免其他的update在主键索引上更新)

id非唯一索引

满足id=10查询条件的记录,都加锁,并且这些记录对应的主键索引的记录上也都加了锁。

id无索引

会锁住整个聚簇索引的记录,无论记录是否满足条件,全部被加上X锁。
MySql实现:如果一个条件无法通过索引快速过滤,那么存储引擎层面就会将所有记录加锁后返回,然后由MySql Server层进行过滤。
MySQL 为了效率,做了优化,对于不满足条件的记录,会在判断后释放锁,最终持有的是满足条件的记录上的锁。

Repeatable Read

id主键

在id主键索引上添加行锁。

id 唯一索引

在唯一索引上添加行锁,同时在聚簇索引上也添加一个X锁(由于唯一的只有一个,因此不需要添加间隙锁)

id 非唯一索引

在id索引上添加锁,在id索引的记录之间添加GAP锁(解决幻读,锁住的是记录之间的间隙)。同时在聚簇索引上添加锁。

id无索引

在整个表的聚簇索引上都会加上Next-Key锁(包括主键锁及间隙锁)。
但MySql做了一些优化,称做semi-consistent read,在semi-consistent开启的情况下,对于不满足查询条件的记录,MySql会提前释放锁。

注:在MySql Innodb中,所谓的读不加锁,并不适用于所有的情况,而是隔离级别相关的,serializable隔离级别,读不加锁就不成立,所有的读操作都是当前读。
原创粉丝点击