- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个多线程应用程序,可以锁定和解锁我的一个 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 语句都将持有锁,直到 COMMIT
或 ROLLBACK
发生。
我相信空闲 session 的默认“超时”是 8 小时,指定为以秒为单位的值:
SHOW VARIABLES LIKE 'wait_timeout'
在一个 session 空闲了 wait_timeout
秒后,MySQL 将终止该 session ,并释放该 session 持有的所有锁。
关于mysql - 如果调用 "SELECT FOR UPDATE"的线程死了会怎样?该行是否永远锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22797425/
我是一名优秀的程序员,十分优秀!