MySQL:锁
accttodo 12/31/2023 后端数据库MySQL
目录
参考:
# MySQL:锁
MySQL的InnoDB存储引擎锁机制分为表级锁和行级锁。
# 一、行级锁
行级锁中有共享锁和排它锁。
MySQL的InnoDB存储引擎默认的修改数据语句(update/delete/insert)都会自动给涉及到的数据加上排他锁,查询语句(select)默认不会加任何锁类型。
# 1.1 共享锁
共享锁又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。
select * from t_user where id = 10 lock in share mode;
1
# 1.2 排他锁
排他锁又称为写锁(独占锁),简称X锁,顾名思义,排他锁就是不能与其他锁并存。如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁。
select * from t_user where id = 10 for update;
1
# 1.3 行级锁的优劣
- 行锁的劣势:开销大;加锁慢;会出现死锁。
- 行锁的优势:锁的粒度小,处理并发的能力高。
# 二、表级锁
表级锁中有意向共享锁和意向排它锁。
MySQL的InnoDB存储引擎意向锁是自动加的,不需要用户干预。
# 2.1 意向共享锁
意向共享锁(IS):表示事务准备给数据行加入共享锁,也就是说一个数据行加共享锁前必须先取得该表的意向共享锁;
# 2.2 意向排他锁
意向排他锁(IX):类似上面,表示事务准备给数据行加入排他锁,说明事务在一个数据行加排他锁前必须先取得该表的意向排他锁。
# 2.3 表级锁的优劣
- 表锁的优势:开销小;加锁快;无死锁。
- 表锁的劣势:锁粒度大,并发处理能力低。