mysql lock tables

要解决的一个应用是
执行一个业务逻辑时将表锁住,其他同时执行该业务逻辑的业务必须等当前占用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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值