为什么 id=<pk> 的简单更新会导致锁等待?

问题描述 投票:0回答:1

尝试对同一个表和同一个键(id 为 pk)执行 2 次更新,其中一次由于锁等待超时而死亡。我不明白如何解决。

你好! 请您向我解释一件简单的事情。说实话,感觉就像一个垃圾场。

herzner 云实例上的 docker 中的 mysql:8.2.0。

  1. 我有一张桌子:
create table if not exists arb.cross_exchange_current_orders_snapshot
(
    id          int auto_increment
        primary key,
    exchange_id int      not null,
    symbol_id   int      null,
    currency_id int      null,
    filter_id   int      null,
    bid         double   not null,
    bid_volume  double   null,
    ask         double   not null,
    ask_volume  double   null,
    timestamp   datetime not null,
    constraint FK_4C1F562238248176
        foreign key (currency_id) references arb.currency (id),
    constraint FK_4C1F562268AFD1A0
        foreign key (exchange_id) references arb.exchange (id),
    constraint FK_4C1F5622C0F75674
        foreign key (symbol_id) references arb.symbol (id),
    constraint FK_4C1F5622D395B25E
        foreign key (filter_id) references arb.cross_exchange_opportunity_filter (id)
)
    collate = utf8mb4_unicode_ci;

  1. 以并发方式执行来自我的工作人员(大约 150 个)的更新查询。 每次更新都是这样的
UPDATE arb.cross_exchange_current_orders_snapshot 
SET bid = '1.9715347482999', bid_volume = '507.21905909206', ask = '1.9717884658038', ask_volume = '507.15379329108', timestamp = '2024-02-10 20:47:09' 
WHERE id = 9101;
  1. 正如我们所知,在这种情况下需要授予 X 锁,如果没有发生,则意味着需要保留它。

一段时间后,我看到一些查询等待锁定 50 秒。

问题:为什么第一个不能更快地完成他的工作(更新)并释放第二个的锁。

每次我有大约 100 个中的 6-16 个锁等待查询,这些查询执行得很好并且在显示进程列表中根本不可见。

请问,为什么?


当我开始调查时,我研究了不同的东西,甚至是这样的查询

select * from performance_schema.data_locks
         where LOCK_DATA in (
select LOCK_DATA from performance_schema.data_locks where LOCK_STATUS="WAITING")  

我证实了我的愿景。 每次我都有2个trans。一是等待锁,二是保持锁。

尝试了很多mysql配置、iostat等。一切看起来都很好。

一件有趣的事情是,在 mysql 容器重新启动一段短时间(也许 15 分钟)后,一切都运行得非常非常快。

mysql sql-update locking
1个回答
0
投票

问题出在之前的事务上,由于某种原因无法提交。 谢谢!

© www.soinside.com 2019 - 2024. All rights reserved.