mysql悲观锁读时加锁吗

MySQL悲观锁读操作是否加锁解析

mysql悲观锁读时加锁吗

关于MySQL悲观锁在读操作时是否加锁
1.共享锁(S锁)
在MySQL中,悲观锁可以通过SELECT … LOCK IN SHARE MODE实现共享锁(S锁)。当一个事务对某条记录加上了共享锁之后,其他事务仍然可以对该记录进行读取操作,但是不能对其进行修改或删除操作。这意味着,在使用共享锁的情况下,读操作本身并不阻止其他事务的读操作。

2.排他锁(X锁)
对于排他锁(X锁),通常由SELECT … FOR UPDATE语句触发。在这种模式下,当前事务不仅能够读取被锁定的数据行,还可以对其执行更新或删除操作。然而,其他任何试图访问这些数据行的事务都将无法获得该资源上的任何形式的锁(无论是共享锁还是排他锁),直到持有排他锁的事务完成并释放锁为止。因此,在排他锁作用范围内,其他事务既不能读也不能改受影响的数据行2。

3.InnoDB存储引擎的行为特性
需要注意的是,InnoDB作为MySQL默认的支持事务和外键约束的存储引擎,其行为取决于具体的查询条件以及所涉及列是否存在有效的索引结构。例如,仅当查询利用到了主键或者具有合适覆盖范围的辅助索引来定位目标行时,才会施加真正的行级锁;否则可能会退化成整个表级别的封锁状态。

综上所述:

如果采用 LOCK IN SHARE MODE, 则允许别的会话同时做只读型的操作 (即同样形式的 share mode select),但不允许他们做出改变这条记录的动作。
若选择了 FOR UPDATE, 那么除了自己之外没有任何其它方可以在未等到原交易结束之前触及到那部分资料集 —— 不管是单纯查看还是尝试变动都不可行。

-- 示例代码展示如何应用悲观锁
BEGIN;
SELECT * FROM table_name WHERE id = 1 FOR UPDATE; -- 添加排他锁 (X锁)
COMMIT;

BEGIN;
SELECT * FROM table_name WHERE id = 1 LOCK IN SHARE MODE; -- 添加共享锁 (S锁)
COMMIT;
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值