欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

动手实践:探究MySQL的共享锁与排他锁

最编程 2024-08-05 09:58:17
...

首先我们必须要明白加锁的目的是为了解决什么问题,数据库的锁是为了解决事务的隔离性问题,为了让事务之间相互不影响,每个事务进行操作的时候都会对数据加上一把特有的锁,防止其他事务同时操作数据。如果你想一个人静一静,不被别人打扰,那么请在你的房门上加上一把锁。

共享锁与排他锁概念

共享锁,又称为S锁;排他锁又称为X锁

InnoDB实现了两种类型的锁机制:共享锁,又称S锁和排他锁又称X锁。共享锁允许一个事务读取数据,不允许修改数据,如果其他事务要再对该行加锁,只能加共享锁;排他锁是修改数据时加的锁,可以读取处修改数据,一旦一个事务对该行数据加锁,其他事务将不能再对该数据加任何锁。

加锁方式

# 获取共享锁
select ... lock in share mode;

# 获取排它锁
select ... for update; 

实验

演示实际的效果

# 准备数据 
create table t (id int auto_increment, name varchar(10), primary key (id));
insert into t (name) values ('1'), ('2'), ('3');

两个事务的共享锁可以同时读取数据的,一个事务共享锁 一个事务拿到排他锁之后,另一个事务则获取不到共享锁、排锁了,是互斥的

事务A,通过共享锁读取一行,事务B也可以通过共享锁读取,但是不能获取排他锁了

# 事务A
start transaction;
select * from t where id = 1 lock in share mode;
select * from t where id = 1 for update;

update t set name = 'aa' where id = 1;
commit;

# 事务B
start transaction;
select * from t where id = 1 lock in share mode;
select * from t where id = 1 for update;
update t set name = 'aa' where id = 1;
commit;

7c42616c_1013081.png

image.png

总结

  1. 事务拿到某一行记录的共享S锁,才可以读取这一行
  2. 事务拿到某一行记录的排它X锁,才可以修改或删除这一行