我有一个多线程应用程序,用于锁定和解锁我的一个MYSQL表中的行。例如,与此表交互的所有线程在稍后的某个时间调用SELECT ... FOR UPDATE;
后跟UPDATE ...
。我担心如果通过调用SELECT ... FOR UPDATE
获取独占锁的线程死掉并且永远无法调用将释放锁的UPDATE ...
会发生什么。那我会陷入僵局吗?如果有锁的线程死了,有没有办法强制释放锁?
答案 0 :(得分:4)
当MySQL客户端进程会话终止时,将自动释放锁。 (我指的是MySQL发起并在MySQL服务器上维护的会话,这个MySQL声明报告了#34;会话"
SHOW PROCESSLIST;
如果客户端应用程序死亡并使MySQL客户端会话在服务器上保持活动状态,则锁定将继续保持,直到客户端会话线程终止(由于空闲等待超时,或由于MySQL {{1}声明被执行。)
这不一定会导致死锁"条件。 (死锁是指MySQL确定两个或多个进程会话正在持有另一个进程会话所需的锁;如果它只是一个进程会话持有一个锁,并且进程会话不尝试(即等待)获取对另一个会话锁定的资源的锁定,然后它将& #39; t导致"死锁"。另一个进程会话试图获取一个锁(在同一行/块上)将挂起,等待锁被释放
不只是KILL
可以锁定;在事务的上下文中,任何DML语句都将保持锁定,直到SELECT ... FOR UPDATE
或COMMIT
发生。
我相信默认"超时"对于空闲会话是8小时,指定为以秒为单位的值:
ROLLBACK
会话空闲一段SHOW VARIABLES LIKE 'wait_timeout'
秒后,MySQL将终止会话,该会话持有的任何锁定都将被释放。