gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:54:39 27 4
gpt4 key购买 nike

这不是一个完整/正确的 MySQL 查询伪代码:

Select *
from Notifications as n
where n.date > (CurrentDate-10 days)
limit by 1
FOR UPDATE

http://dev.mysql.com/doc/refman/5.0/en/select.html状态:如果将 FOR UPDATE 与使用页锁或行锁的存储引擎一起使用,则查询检查的行将被写锁定,直到当前事务结束

这里是只有一条返回的记录被 MySQL 锁定,还是它必须扫描所有记录才能找到单个记录?

最佳答案

我们为什么不试试呢?

设置数据库

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');

还有 block !

我现在不能确定 MySQL 是否会在一定百分比的行被锁定时继续并锁定整个表,或者它实际上在确保 SELECT 的结果方面真的很聪明。 . FOR UPDATE 查询永远不会被另一个事务(使用 INSERTUPDATEDELETE)更改正在举行。

关于mysql - 使用 MySQL 的 FOR UPDATE 锁定时,究竟锁定了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6066205/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com