与'sleep'一样,当除一个线程外的所有线程都达到阻塞状态时,也可以使用此方法。
如果能够通过使用SQL语句检测线程处于阻塞状态,则可以使用此方法。其余的线程运行语句,直到返回预期的结果。然后继续测试。
例子:
——表t1写——connection conn2 #获取线程的id。让$conn2_id= ' SELECT CONNECTION_ID() ';#这会阻塞wait_for_lock()。发送INSERT INTO t1 VALUES (1);——connection conn1 #指定显示conn2是否达到wait_for_lock()的条件。让$wait_condition= SELECT 1 FROM INFORMATION_SCHEMA。WHERE ID = $conn2_id AND STATE = '锁定';在循环中运行条件,直到它为真。——包括/ wait_condition来源。inc # Run through the critical code. FLUSH TABLE t1;
在conn2中,我们首先获取线程ID。在conn1中,当进程列表显示conn2达到“锁定”状态时,我们使用SELECT语句返回“1”。在这个设置中,我们调用wait_condition方法。它运行语句并检查结果。如果不满足条件,则休眠0.1秒并重试。
时间的最大浪费是0.1秒。这比“睡眠”方法好得多,但仍然会浪费一点时间。
另一个问题是,条件在某些情况下可能是“模糊的”。在上面的例子中,线程状态(proc_info)在调用锁定函数之前被设置为“Locked”。理论上,conn1可能在conn2获得锁之前继续。然后,测试将无法重复它想要做的事情。
“调试同步功能”应该能够取代大部分“等待条件”的使用。