MySql锁概述
数据库中锁设计出来的初衷是处理并发问题,保证数据的安全
MySQL 数据库锁可以从下面 3 个维度进行划分:
- 按照锁的使用方式,MySQL 锁可以分成共享锁、排他锁两种;
- 根据加锁的范围,MySQL 锁大致可以分成全局锁、表级锁和行锁三类;
- 从思想层面上看,MySQL 锁可以分为悲观锁、乐观锁两种;
共享锁与排它锁
共享锁:
如何使用(语法介绍)
共享锁,Share lock,也叫读锁。它是指当对象(数据库表资源-可以是整张表,也可以是表中若干行)被锁定时,允许其它事务读取该对象,也允许其它事务从该对象上再次获取共享锁,但不能对该对象进行写入。
加锁方式有如下两种方式:
-- 方式1 mysql5 语法
select ... from 表名 lock in share mode;
-- 方式2 mysql8 以后语法
select ... from 表名 for share;
给 user 表加共享锁(表级共享锁)
给 user 表 id=3 的行加共享锁(行级共享锁)
共享锁小结
通过上述两个实例可以看出:
-
当共享锁加在 user 表上,则其它事务可以再次获取 user 表的共享锁、可以进行读操作,但是无法获取user表的排他锁失败、写操作会被堵塞;
-
当共享锁加在 user 表 id=3 的行上,则其它事务可以再次获取 user 表 id=3 行上的共享锁、可以进行读操作,其它事务再次获取 user 表 id=3 行上的排他锁失败,写操作被堵塞,但是事务可以再次获取 user 表 id=3 以外行上的排他锁;
总之:
-
无论共享表锁还是共享的行锁,其它会话或者事务都可以进行读操作,但是会阻塞写操作,对于共享行锁来说,只阻塞当前共享行锁锁定的行;
-
对于当前获取共享锁的事务,内部可发生写操作(共享锁不对自身限制);
排它锁:
如何使用(语法介绍)
排它锁,Exclusive Lock,也叫写锁或者独占锁,主要是防止其它事务和当前加锁事务锁定同一对象。同一对象主要有两层含义:
-
当排他锁加在表上,则其它事务无法对该表进行 insert,update,delete,alter,drop 等更新操作;
-
当排他锁加在表的行上,则其它事务无法对该行进行 insert,update,delete,alter,drop 等更新操作;
排它锁加锁方式为:
-- 排它锁加锁方式
select ... from 表名 for update;
给 user 表对象加排他锁
给 user 表 id=3 的行对象加排他锁
排它锁小结
- 排它锁对读操作不阻塞,但是对其它读操作过程中需要获取排它锁的请求会阻塞
- 排它锁会阻塞其它事务对排它锁锁定资源的写操作;