Mysql中的锁

MySQL 中常用的锁有哪几种?

  1. 行级锁(Row-Level Locks):行级锁是 MySQL 中最常用的锁类型,它可以在行级别上控制并发访问。在使用行级锁时,只有访问同一行的事务之间才会发生冲突。
  2. 表级锁(Table-Level Locks):表级锁是 MySQL 中最基本的锁类型,它会锁定整个表。在使用表级锁时,如果一个事务已经获得了表级锁,其他事务就无法同时访问该表。
  3. 共享锁(Shared Locks):共享锁也称为读锁,它可以被多个事务同时持有,但是它阻止了其他事务对被锁定对象的写访问。在使用共享锁时,多个事务可以同时读取同一个数据,但是只有一个事务可以对数据进行写操作。
  4. 排他锁(Exclusive Locks):排他锁也称为写锁,它只能被一个事务持有,并且阻止了其他事务对被锁定对象的读和写访问。在使用排他锁时,只有一个事务可以对数据进行修改。
  5. 自增锁(AUTO-INC Locks):当使用 AUTO_INCREMENT 列时,MySQL 会自动给该列加上一个自增锁。这个锁是表级锁,它在插入数据时保证了自增 ID 的唯一性。
  6. 其他锁:还有一些特殊的锁类型,例如间隙锁(Gap Locks)、临键锁(Next-Key Locks)等。这些锁主要用于解决一些特定的问题,例如避免幻读等。

行锁、间隙锁、排它锁

  1. 行锁(Record Lock)
    行锁是直接锁定索引记录的一种锁。当事务对某条记录进行UPDATE、DELETE或SELECT … FOR UPDATE操作时,InnoDB会自动对该记录加行锁。

例子:

假设有一个名为users的表,包含id和name两个字段,其中id是主键。

BEGIN; -- 开始事务  
SELECT * FROM users WHERE id = 10 FOR UPDATE; -- 对id为10的记录加行锁  
-- 此时,其他事务无法修改或删除id为10的记录,直到当前事务提交或回滚。  
COMMIT; -- 提交事务,释放锁
  1. 间隙锁(Gap Lock)
    间隙锁锁定的是索引记录之间的间隙,即两个索引记录之间的空间,但不包括索引记录本身。间隙锁主要用于防止幻读,确保在可重复读(Repeatable Read)隔离级别下,同一个事务多次读取同样范围的数据时,看到的数据是一致的。
BEGIN; -- 开始事务  
SELECT * FROM users WHERE id BETWEEN 10 AND 20 FOR UPDATE; -- 假设id为10到20之间的记录不存在  
-- 此时,InnoDB会对id为10到20之间的间隙加间隙锁,防止其他事务插入id为11、12等的记录。  
COMMIT; -- 提交事务,释放锁

注意:在这个例子中,由于id为10到20之间的记录不存在,所以实际上加的是间隙锁,而不是行锁。

  1. 临键锁(Next-Key Lock)
    临键锁是行锁和间隙锁的组合,它锁定一个范围,并且包括这个范围内的所有索引记录以及索引记录之间的间隙。临键锁锁定的区间是左开右闭的。在可重复读(Repeatable Read)隔离级别下,InnoDB默认使用临键锁来锁定查询涉及的索引范围和记录。
BEGIN; -- 开始事务  
SELECT * FROM users WHERE id >= 10 AND id < 20 FOR UPDATE; -- 锁定id为10到20(不包括20)之间的所有记录和间隙  
-- 此时,其他事务无法插入、修改或删除id为10到19的记录,也无法插入id为20的记录(因为间隙锁),直到当前事务提交或回滚。  
COMMIT; -- 提交事务,释放锁

在这个例子中,InnoDB会对id为10到19的记录加行锁,并对id为10到20之间的间隙加间隙锁,形成临键锁。

  1. 什么时候临建锁会转换为行锁
  • 唯一索引的等值查询:当查询条件是基于唯一索引的等值查询,并且该查询命中了记录时,InnoDB会将临键锁降级为行锁。这是因为唯一索引保证了查询结果只有一条记录,因此不需要对间隙加锁。
  • 优化机制:InnoDB在加锁时会进行一些优化,以减少锁的范围和提高并发性能。在某些情况下,如果InnoDB认为可以安全地将临键锁降级为行锁而不影响事务的隔离性和一致性,它可能会这样做。
SELECT * FROM table_name WHERE id = 10 FOR UPDATE;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值