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