如果调用“SELECT FOR UPDATE”的线程死掉会怎么样?行是永久锁定的吗?

时间:2014-04-01 21:40:38

标签: mysql multithreading locking innodb deadlock

我有一个多线程应用程序,用于锁定和解锁我的一个MYSQL表中的行。例如,与此表交互的所有线程在稍后的某个时间调用SELECT ... FOR UPDATE;后跟UPDATE ...。我担心如果通过调用SELECT ... FOR UPDATE获取独占锁的线程死掉并且永远无法调用将释放锁的UPDATE ...会发生什么。那我会陷入僵局吗?如果有锁的线程死了,有没有办法强制释放锁?

1 个答案:

答案 0 :(得分:4)

当MySQL客户端进程会话终止时,将自动释放锁。 (我指的是MySQL发起并在MySQL服务器上维护的会话,这个MySQL声明报告了#34;会话"

SHOW PROCESSLIST;

如果客户端应用程序死亡并使MySQL客户端会话在服务器上保持活动状态,则锁定将继续保持,直到客户端会话线程终止(由于空闲等待超时,或由于MySQL {{1}声明被执行。)

这不一定会导致死锁"条件。 (死锁是指MySQL确定两个或多个进程会话正在持有另一个进程会话所需的锁;如果它只是一个进程会话持有一个锁,并且进程会话尝试(即等待)获取对另一个会话锁定的资源的锁定,然后它将& #39; t导致"死锁"。另一个进程会话试图获取一个锁(在同一行/块上)将挂起,等待锁被释放

不只是KILL可以锁定;在事务的上下文中,任何DML语句都将保持锁定,直到SELECT ... FOR UPDATECOMMIT发生。


我相信默认"超时"对于空闲会话是8小时,指定为以秒为单位的值:

ROLLBACK

会话空闲一段SHOW VARIABLES LIKE 'wait_timeout' 秒后,MySQL将终止会话,该会话持有的任何锁定都将被释放。