飞道的博客

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

387人阅读  评论(0)

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;

转载:https://blog.csdn.net/chinabestchina/article/details/105282630
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场