欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

mysql中存储引擎为Innodb的锁介绍

程序员文章站 2024-01-20 22:15:04
...

mysql中存储引擎为Innodb的锁介绍

一、简介

在mysql中,有各种锁,在这里主要对存储引擎为Innodb的常用的锁进行介绍。

二、Innodb引擎锁知识点

2.1 锁的粒度

锁的粒度有行锁(锁加在行上)和表锁(锁加在表上),Innodb的锁默认是行锁(也支持表锁),需要注意的是,行锁(与oracle不同,oracle的锁是加在数据块上的数据行上)是加在索引上的,也就是说,只有通过索引检索数据,才会使用行锁,否则,将使用表锁。

2.2 锁的事务隔离级别

锁的事务有四个隔离级别:

  • 未提交读(read uncommited、脏读)
  • 已提交读(read commited、不可重复读)
  • 可重复读(repeatable read、幻读)
  • 可串行化(serializable)

其中mysql默认事务隔离级别是可重复读,对于该级别出来的幻读,mysql是通过多版本并发控制(mvcc,multiversion concurrency control)处理的。

2.3 innodb锁的类型

行级锁分为共享锁(S锁)、排他锁(X锁)。

为了行锁和表锁共存,实现更细粒度控制的表锁分为意向共享锁(IS锁,表锁)、意向排它锁(IX锁,表锁),

注意意向锁是Innodb自动加的,对于update、delete、insert,Innodb会自动加排他锁,对于select不会加锁。

  • 共享锁(S锁):允许获得锁的事务读某行,阻止其它事务获取相同行的排它锁。

  • 排他锁(X锁):允许获取锁的事务更新数据,阻止其它事务获取相同行的共享锁和排它锁。

  • 意向共享锁(IS锁):事务在打算给数据加共享锁前,必须获得该表的意向共享锁。

  • 意向排它锁(IX锁):事务在打算给数据加排它锁前,必须获得该表的意向排它锁。

2.4 间隙锁(next-key)锁

正常加锁时,除检索范围内的已存在数据行的索引会被加锁,在检索范围内,但不存的数据行,这部分叫做间隙,innodb也会对这个间隙加锁,即是间隙锁。也就是说在检索范围内,不管真实是否有数据行,都会被锁住。

三、Innodb引擎锁操作及示例

3.1 查看事务提交模式

mysql的事务默认是自动提交(autocommmit)的,查看用:

show variables like 'AUTOCOMMIT';

1或ON表示启用,0或OFF表示禁用。当为0或OFF时,所有查询在一个事务内,直到显式执行commit提交或rollback回滚操作。
修改用:

set AUTOCOMMIT=0;

3.2 显示加共享锁

如:

select * from stu lock in share mode;

3.3 显示加排他锁

如:

select * from stu for update;
相关标签: mysql锁