要解决的一个应用是
执行一个业务逻辑时将表锁住,其他同时执行该业务逻辑的业务必须等当前占用locked 表资源的业务完成之后才能执行业务。
因此要用lock tables来实现该功能。
Thinkphp有个M()->lock(true)的功能,但是它其实不是锁表,它是在事务中在sql添加 for update。
当然,用事务也能实现以上逻辑。参考
http://www.thinkphp.cn/topic/9964.html
但我们的表是MYISAM的,也不想为了这个功能就将schema改成INNODB。
因此,还是要用lock tables来实现。
看下面的代码,请注意:testSelectLock也必须执行锁表操作,否则即使执行testLock,testSelectLock也可以查出数据。
查看当前锁表的表记录,使用以下sql查看
同时锁住多个表
今天又出现了一个问题,lock article表之后要对另一个表进行查询和新增,这时会sql不会执行,db error:
Table 'config_kicker' was not locked with LOCK TABLES
为了解决这个问题,必须将config_kicker也一起lock下。
M()->query("lock tables plan_article,config_kicer write");
参考
http://book.51cto.com/art/200803/68121.htm
http://blog.csdn.net/iefreer/article/details/8733723
http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html
执行一个业务逻辑时将表锁住,其他同时执行该业务逻辑的业务必须等当前占用locked 表资源的业务完成之后才能执行业务。
因此要用lock tables来实现该功能。
Thinkphp有个M()->lock(true)的功能,但是它其实不是锁表,它是在事务中在sql添加 for update。
当然,用事务也能实现以上逻辑。参考
http://www.thinkphp.cn/topic/9964.html
但我们的表是MYISAM的,也不想为了这个功能就将schema改成INNODB。
因此,还是要用lock tables来实现。
看下面的代码,请注意:testSelectLock也必须执行锁表操作,否则即使执行testLock,testSelectLock也可以查出数据。
public function testLock()
{
set_time_limit(0);
M()->query("lock tables plan_article write");
file_put_contents('test.log', "locked",FILE_APPEND) ;
sleep(15);
M()->query("unlock tables");
file_put_contents('test.log', "unlocked",FILE_APPEND) ;
}
public function testSelectLock()
{
M()->query("lock tables plan_article write");
$result = M("plan_article")->limit(5)->select();
dump($result);
}
查看当前锁表的表记录,使用以下sql查看
show OPEN TABLES where In_use > 0;
同时锁住多个表
lock tables plan_article write,config_kicker write
今天又出现了一个问题,lock article表之后要对另一个表进行查询和新增,这时会sql不会执行,db error:
Table 'config_kicker' was not locked with LOCK TABLES
为了解决这个问题,必须将config_kicker也一起lock下。
M()->query("lock tables plan_article,config_kicer write");
参考
http://book.51cto.com/art/200803/68121.htm
http://blog.csdn.net/iefreer/article/details/8733723
http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html