mysql 定时锁定表_当使用MySQL的FOR UPDATE锁定时,究竟锁定了什么?

这篇博客探讨了MySQL中的锁定行为,特别是在并发事务处理中。通过创建和使用数据库`so1`,创建了一个`notification`表,并插入了一些记录。实验显示,当一个事务使用`FOR UPDATE`锁定满足特定条件的行时,其他事务的`SELECT...FOR UPDATE`操作,即使选择不同的行,也会被阻塞。此外,尝试在锁定期间插入新的记录也会被阻止,揭示了MySQL可能采取的全局锁策略或智能行级锁定。这引发了关于MySQL锁定机制在处理并发事务时如何选择和应用锁的深入讨论。

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

为什么我们不试试呢?

设置数据库

CREATE DATABASE so1;

USE so1;

CREATE TABLE notification (`id` BIGINT(20), `date` DATE, `text` TEXT) ENGINE=InnoDB;

INSERT INTO notification(id, `date`, `text`) values (1, '2011-05-01', 'Notification 1');

INSERT INTO notification(id, `date`, `text`) values (2, '2011-05-02', 'Notification 2');

INSERT INTO notification(id, `date`, `text`) values (3, '2011-05-03', 'Notification 3');

INSERT INTO notification(id, `date`, `text`) values (4, '2011-05-04', 'Notification 4');

INSERT INTO notification(id, `date`, `text`) values (5, '2011-05-05', 'Notification 5');

现在,启动两个数据库连接

连接1

BEGIN;

SELECT * FROM notification WHERE `date` >= '2011-05-03' FOR UPDATE;

连接2

BEGIN;

如果MySQL锁定所有行,则会阻塞以下语句。如果它只锁定它返回的行,它不应该阻止。

SELECT * FROM notification WHERE `date` = '2011-05-02' FOR UPDATE;

确实阻止了。

有趣的是,我们也不能添加将被读取的记录,即

INSERT INTO notification(id, `date`, `text`) values (6, '2011-05-06', 'Notification 6');

块也是!

在这一点上,我不能确定MySQL是否在锁定整个表的一定百分比时锁定整个表,或确实在确定SELECT … FOR UPDATE查询的结果时真的非常聪明在锁定时由另一个事务(使用INSERT,UPDATE或DELETE)进行更改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值