数据库内容复习07-MySql的行级锁共享锁与排它锁

May 10, 2019 00:00 · 718 words · 2 minute read 数据库 SQL MySql 数据库查询优化

复习数据库方面的内容, 以下为笔记内容, 参考了:
MySQL中的共享锁与排他锁

共享锁(Share Lock)

共享锁又称读锁,是读取操作创建的锁。其他用户可以并发读取数据,但任何事务都不能对数据进行修改(获取数据上的排他锁),直到已释放所有共享锁。

如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。

用法

SELECT ... LOCK IN SHARE MODE;

在查询语句后面增加LOCK IN SHARE MODE,Mysql会对查询结果中的每行都加共享锁,当没有其他线程对查询结果集中的任何一行使用排他锁时,可以成功申请共享锁,否则会被阻塞。其他线程也可以读取使用了共享锁的表,而且这些线程读取的是同一个版本的数据。

实例

终端 A 终端 B
set autocommit=0
select id, name from myTable where id in (1, 2) lock in share mode;
记录: (1, 摩西), (2, 约书亚)
select id, name from myTable where id in (1, 2);
记录: (1, 摩西), (2, 约书亚)
update myTable set name=加勒 where where id=3;
(更新成功)
update myTable set name=Mose where where id=1;
(卡住…)
(卡住…)
commit;
(更新成功)

排他锁(eXclusive Lock)

排他锁又称写锁,如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。

用法

SELECT ... FOR UPDATE;

在查询语句后面增加FOR UPDATE,Mysql会对查询结果中的每行都加排他锁,当没有其他线程对查询结果集中的任何一行使用排他锁时,可以成功申请排他锁,否则会被阻塞。

实例

终端 A 终端 B
set autocommit=0
select id, name from myTable where id in (1, 2) for update;
记录: (1, 摩西), (2, 约书亚)
select id, name from myTable where id in (4, 5, 6);
(正常放回记录)
select id, name from myTable where id=1;
(卡住…)
(卡住…)
update myTable set name=Mose where where id=1; (卡住…)
commit; (卡住…)
返回记录: (1, Mose)