gpt4 book ai didi

mysql - 如果调用 "SELECT FOR UPDATE"的线程死了会怎样?该行是否永远锁定?

转载 作者:行者123 更新时间:2023-11-29 01:40:56 24 4
gpt4 key购买 nike

我有一个多线程应用程序,可以锁定和解锁我的一个 MYSQL 表中的行。例如,我所有与此表交互的线程都调用 SELECT ... FOR UPDATE;,随后在稍后调用 UPDATE ...。我担心如果通过调用 SELECT ... FOR UPDATE 获取独占锁的线程死掉并且从未设法调用将释放的 UPDATE ...锁。那我会陷入僵局吗?如果持有锁的线程死了,有没有办法强制释放锁?

最佳答案

当MySQL客户端 process session 终止时,锁会自动释放。 (我指的是 MySQL 发起并在 MySQL 服务器上维护的 session ,这个 MySQL 语句报告的“ session ”:

SHOW PROCESSLIST;

如果客户端应用程序死掉并让 MySQL 客户端 session 在服务器上保持事件状态,锁将继续持有,直到客户端 session 线程终止(由于空闲等待超时,或由于 MySQL KILL 语句被执行。)

这不一定会导致“死锁”情况。 (死锁是当 MySQL 确定两个或多个 process session 持有另一个 process session 所需的锁;如果它只是一个 process 持有锁的 session ,并且 process session 尝试(即等待)获取对另一个 session 锁定的资源的锁定,那么它不会导致一个“死锁”。另一个试图获取锁(在同一行/ block 上)的 process session 将挂起,等待锁被释放。

不仅仅是 SELECT ... FOR UPDATE 可以持有锁;在事务上下文中,任何 DML 语句都将持有锁,直到 COMMITROLLBACK 发生。


我相信空闲 session 的默认“超时”是 8 小时,指定为以秒为单位的值:

SHOW VARIABLES LIKE 'wait_timeout'

在一个 session 空闲了 wait_timeout 秒后,MySQL 将终止该 session ,并释放该 session 持有的所有锁。

关于mysql - 如果调用 "SELECT FOR UPDATE"的线程死了会怎样?该行是否永远锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22797425/

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