———————————————–
DEBUG_EXECUTE_IF主要用于当设置了某个关键字key时,执行后面的代码,
可以简单的表示为:
DEBUG_EXECUTE_IF(key, code)
例如在open_and_lock_tables函数中.
5527 if (open_tables(thd, &tables, &counter, flags, prelocking_strategy))
5528 goto err;
5529
5530 DBUG_EXECUTE_IF("sleep_open_and_lock_after_open", {
5531 const char *old_proc_info= thd->proc_info;
5532 thd->proc_info= "DBUG sleep";
5533 my_sleep(6000000);
5534 thd->proc_info= old_proc_info;});
5535
5536 if (lock_tables(thd, tables, counter, flags))
5537 goto err;
那么如何让其生效呢,执行如下语句即可:
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的锁