Pop*_*orn 4 mysql multithreading deadlock innodb locking
我有一个多线程应用程序,可以在我的 MYSQL 表之一中锁定和解锁行。举个例子,我所有的线程与此表调用交互SELECT ... FOR UPDATE;随后UPDATE ...晚些时候。我担心如果通过调用获取排他锁的线程SELECT ... FOR UPDATE死亡并且永远无法调用UPDATE ...会释放锁的线程会发生什么。那么我会陷入僵局吗?如果拥有锁的线程死亡,有没有办法强制释放锁?
当 MySQL 客户端进程会话终止时,锁将自动释放。(我指的是 MySQL 已启动并在 MySQL 服务器上维护的会话,此 MySQL 语句报告的“会话”:
SHOW PROCESSLIST;
Run Code Online (Sandbox Code Playgroud)
如果客户端应用程序死掉并让 MySQL 客户端会话在服务器上保持活动状态,锁将继续保持,直到客户端会话线程终止(由于空闲等待超时,或由于KILL执行MySQL语句。)
这不一定会导致“死锁”情况。(死锁是当 MySQL 确定两个或多个进程会话持有另一个进程会话所需的锁时;如果它只是一个进程会话持有锁,并且该进程会话没有尝试(即等待)获取锁在另一个会话锁定的资源上,那么它不会导致“死锁”。另一个尝试获取锁(在同一行/块上)的进程会话将挂起,等待锁被释放。
它不仅仅是一个SELECT ... FOR UPDATE可以持有锁的;在事务的上下文中,任何 DML 语句都将保持锁定,直到COMMIT或ROLLBACK发生。
我相信空闲会话的默认“超时”是 8 小时,指定为以秒为单位的值:
SHOW VARIABLES LIKE 'wait_timeout'
Run Code Online (Sandbox Code Playgroud)
在会话空闲wait_timeout数秒后,MySQL 将终止会话,并且该会话持有的任何锁都将被释放。