Mysql——加读锁、加写锁

本文详细介绍了MySQL表级锁中加读锁和加写锁的操作及影响。加读锁时,当前会话只能对加锁表读,其他会话读可行、写需等待;加写锁时,当前会话可对加锁表任意操作,其他会话需等锁释放。还提及MyISAM表操作时读、写锁的阻塞情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 加读锁:

会话0:
lock table tablelock read;
select * from tablelock; —读(查),可以(自己加了锁,自己可以读)
delete from tablelock where id=1; —写(增删改),不可以

在当前会话中访问其他表(emp表,未加锁):
select * from emp; —读,不可以
delete from emp where eid = 1; —写,不可以

结论1:
—如果某一个会话,对A表加了锁,则该会话可以对A表进行读操作,不能进行写操作;且该会话不能对其他表进行读、写操作。
—即如果给A表加了读锁,则当前会话只能对A表进行读操作。

会话1(其他会话):
select * from tablelock; --读(查),可以
delete from tablelock where id=1; —写,会“等待”会话0将锁释放

select * from emp; --读(查),可以
delete from emp where eid=1; —写,可以

结论2:
会话0给A表加了锁:

  • 其他会话的操作:
    a.可以对其他表(A表以外的表)进行读、写操作
    b.对A表:读–可以;写–需要等待释放锁

  • 加写锁:

会话0:
lock table tablelock write;
结论:当前会话(会话0)可以对加了写锁的表进行任何操作(增删改查);但是不能操作(增删改查)其他表

其他会话:
对会话0中加写锁的表可以进行增删改查的前提是:等待会话0释放写锁

MySQL表级锁的锁模式:
MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,
在执行更新操作(增删改(DML))前,会自动给涉及的表加写锁。

所以对MyISAM表进行操作,会有以下情况:
a.对MyISAM表的读操作(如读锁),不会阻塞其他进程(会话)对同一表的读请求,但会阻塞对同一表的写请求。只有当读锁释放后,才会执行其它进程的写操作。
b.对MyISAM表的写操作(加写锁),会阻塞其他进程(会话)对同一表的读和写操作,只有当写锁释放后,才会执行其他进程的读写操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值