mysql教程:你知道MySQL里的sleep函数怎么用吗?
MySQL数据库中有一个不太常用但便于进行某些调试的函数:sleep(),今天我们就来介绍一下这个函数的用法。
首先,看看官网对于函数的定义:
SLEEP(duration)
Sleeps (pauses) for the number of seconds given by the duration argument, then returns 0. The duration may have a fractional part. If the argument is NULL or negative, SLEEP() produces a warning, or an error in strict SQL mode.
可以看到,这个函数的作用就是休眠,参数是休眠的时长,以秒为单位,也可以是小数。
select sleep(1);
上面语句的执行时间为1秒。我们可以利用这样的效果,来仔细观察一些sql语句的执行情况,比如死锁,因为不加上sleep这个函数,很多SQL语句很快就执行结束,这样就难以复现过程中的细节,关于死锁的模拟,在后面会有例子可供参考。
sleep函数可以放在select子句中,让每行记录都休眠指定的时间,如下所示,sleep的参数是10秒,数据库表中一共有两条记录,整个语句执行的时间为20秒。
select sleep(10),first_name,last_name from employees;
在上面SQL执行期间,使用命令show processlist看看有哪些线程在运行,可以看出上面的SQL语句正在执行。
如果没有满足条件的记录,则sleep函数也不会生效,SQL语句不会休眠。
下面,我们利用sleep函数来模拟死锁的现象。
先创建表:
CREATE TABLE orders
(order_id
int(11) NOT NULL,order_addr
varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
然后打开两个session,可以使用mysql客户端打开两个窗口,先执行下面的SQL语句:
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
insert into orders(order_id,order_addr)
select ‘12345’,sleep(10) from dual where not exists
(select order_id from orders where order_id=’12345′);
再执行下面的SQL语句:
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
insert into orders(order_id,order_addr)
select ‘12345’,234 from dual where not exists
(select order_id from orders where order_id=’12345′);
我们会发现,第二个SQL语句可以正常执行,但第一个SQL语句出现了死锁:
[Err] 1213 – Deadlock found when trying to get lock; try restarting transaction
mysql教程总结:sleep函数让sql语句暂停执行指定的时间,这样可以模拟或者观察sql语句执行过程中的细节,方便进行调试、纠错,希望本文有帮助。
推荐阅读:mysql教程:数据库误操作怎么恢复?