根据MySQL 5.1 的手册,第 13.7.6.4 节 KILL 语法,当您kill
建立连接时,会为该线程设置特定于线程的终止标志。然后将不时检查该标志,即使在一些长时间运行的查询期间也是如此,以便它可以中断查询。
有没有办法指示线程在某种分隔的临界区内不检查kill 标志?
我正在寻找的是这样的:
BEGIN IGNORE_KILLS;
-- if this thread is killed here, it will simply ignore it
END IGNORE_KILLS;
-- here, the thread would be able to tell if someone tried to kill it previously
假设它不存在,或者有人可以为我提供更好的解决方案,让我解释一下我为什么要它。
我有一个应用程序必须对插入到表中的行做出反应,并且它必须是可扩展的。根据MySQL 专家 Baron Schwartz的说法,不应该一直轮询数据库,他建议使用SELECT SLEEP(...)/KILL
.
问题是,在等待连接select sleep(...)
被通知(通过被杀死)它有工作要做之后,我想保证,在它的工作期间(我在上面称之为关键部分),它不会停止做即使在杀手线程发疯并再次杀死它的情况下,它也应该这样做。
我可能已经解决了我的问题......
我担心 2 个不同的杀手线程可以:(1)
show processlist
,(2)选择相同的连接来杀死,(3)然后两者都会kill
。第一次杀人会触发我想要的任何东西的执行,而第二次杀人可能会把事情搞砸。
我错过的最简单且几乎显而易见的解决方案是看问题的另一面:杀手线程必须合作而不是让工作线程无法杀死:杀手线程会 (1)
select get_lock('killer_thread')
,然后只有在获得锁之后他们将 (2)show processlist
, (3)kill
选择线程,最后 (4)select release_lock('killer_thread')
。我假设您指的是Baron 为 Engine Yard 博客撰写的这篇文章...
虽然他确实提供了一些方法来减少在 RDBMS 中实现队列的痛苦,但本文的真正收获是根本不要这样做。有许多可用的产品被设计成队列,而数据库不是其中之一。这会在未来咬你一口。