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

猜你喜欢

转载自lhdst-163-com.iteye.com/blog/2117083
今日推荐