gpt4 book ai didi

php - MySQL行锁的缺点

转载 作者:可可西里 更新时间:2023-11-01 07:09:10 29 4
gpt4 key购买 nike

我在 MySQL 中使用行锁定(事务)来创建作业队列。使用的引擎是 InnoDB。

SQL 查询

START TRANSACTION;
SELECT *
FROM mytable
WHERE status IS NULL
ORDER BY timestamp DESC LIMIT 1
FOR UPDATE;
UPDATE mytable SET status = 1;
COMMIT;

根据这个webpage ,

The problem with SELECT FOR UPDATE is that it usually creates a
single synchronization point for all of the worker processes, and you
see a lot of processes waiting for the locks to be released with
COMMIT.

问题:这是否意味着当执行第一个查询时,需要一些时间才能完成之前的事务,当第二个类似的查询发生在第一个事务提交之前时,它必须在执行查询之前等待它完成?如果这是真的,那么我不明白为什么单行的行锁定(我假设)会影响下一个不需要读取该锁定行的事务查询?

此外,是否可以通过执行 UPDATE 而不是事务来解决这个问题(并且仍然实现行锁定对作业队列的效果)?

UPDATE mytable SET status = 1
WHERE status IS NULL
ORDER BY timestamp DESC
LIMIT 1

最佳答案

如果将 FOR UPDATE 与使用页锁或行锁的存储引擎一起使用,则查询检查的行将被写锁定,直到当前事务结束。使用 LOCK IN SHARE MODE 设置共享锁,允许其他事务读取检查的行但不允许更新或删除它们。关于这个查询

UPDATE mytable SET status = 1
WHERE status IS NULL
ORDER BY timestamp DESC
LIMIT 1

自 innodb 以来

在处理SQL语句的过程中自动获取锁我想也是一样的。

关于php - MySQL行锁的缺点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12594178/

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