0%

[MySQL 调试]DBUG_EXECUTE_IF简介

DEBUG_EXECUTE_IF主要用于当设置了某个关键字key时,执行后面的代码,

可以简单的表示为:

DEBUG_EXECUTE_IF(key,  code)

例如在open_and_lock_tables函数中.

<br />5527 if (open_tables(thd, &tables, &counter, flags, prelocking_strategy))<br />5528 goto err;<br />5529<br />5530 DBUG_EXECUTE_IF("sleep_open_and_lock_after_open", {<br />5531 const char *old_proc_info= thd->proc_info;<br />5532 thd->proc_info= "DBUG sleep";<br />5533 my_sleep(6000000);<br />5534 thd->proc_info= old_proc_info;});<br />5535<br />5536 if (lock_tables(thd, tables, counter, flags))<br />5537 goto err;<br /> 

那么如何让其生效呢,执行如下语句即可:

set session debug=”+d, sleep_open_and_lock_after_open”
 


这时候当进入这个函数时,在执行完open_tables语句后,就会设置thd的状态为DBUG sleep,再sleep 6秒钟,然后再调用lock_tables函数
 
—————-
另外我们在写test case时,也可能用到用户层的锁,使用SQL FUNCTION的方法实现:
GET_LOCK(str, timeout)
—尝试获取一个名为str的锁,等待timeout,返回1表示获取锁成功
IS_FREE_LOCK(str)
—检查名为str的锁是否已经被释放
IS_USED_LOCK(str)
—检查名为str的锁是否已经被占用,如果是,返回占有该锁的线程ID,否则返回NULL
RELEASE_LOCK(str)
—释放名为str的锁