尝试对同一个表和同一个键(id 为 pk)执行 2 次更新,其中一次由于锁等待超时而死亡。我不明白如何解决。
你好! 请您向我解释一件简单的事情。说实话,感觉就像一个垃圾场。
herzner 云实例上的 docker 中的 mysql:8.2.0。
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;
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;
一段时间后,我看到一些查询等待锁定 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 分钟)后,一切都运行得非常非常快。
问题出在之前的事务上,由于某种原因无法提交。 谢谢!