两个kill命令: 1 kill query+线程id, 表示终止这个线程中正在执行的语句;
2 kill connection +线程id, 这里connection可缺省, 表示断开这个线程的连接, 当然如果这个线程有语句正在执行, 也是要先停止正在执行的语句的
使用了kill命令, 却没能断开这个连接。 再执行show processlist命令, 看到这条语句的Command列显示的是Killed。
显示为Killed是什么意思, 不是应该直接在show processlist的结果里看不到这个线程了吗?
大多数情况下, kill query/connection命令是有效的:
1 执行一个查询的过程中, 发现执行时间太久, 要放弃继续查询, 这时我们就可以用kill query命令, 终止这条查询语句。
2 语句处于锁等待的时候, 直接使用kill命令也是有效的
1 收到kill以后, 线程做什么?
当对一个表做增删改查操作时, 会在表上加MDL读锁。 所以, session B虽然处于blocked状态, 但还是拿着一个MDL读锁的。 如果线程被kill的时候, 就直接终止, 那之后这个MDL读锁就没机会被释放了。
实现上, 当用户执行kill query thread_id_B时, MySQL里处理kill命令的线程做了两件事:
1. 把session B的运行状态改成THD::KILL_QUERY(将变量killed赋值为THD::KILL_QUERY);
2. 给session B的执行线程发一个信号
隐含了这么三层意思:
1. 一个语句执行过程中有多处“埋点”, 在这些“埋点”的地方判断线程状态, 如果发现线程状态是THD::KILL_QUERY, 才开始进入语句终止逻辑;
2. 如果处于等待状态, 必须是一个可以被唤醒的等待, 否则根本不会执行到“埋点”处;
3. 语句从开始进入终止逻辑, 到终止逻辑完全完成, 是有一个过程的。
