mysql LOCK TABLES

不需使用workmutex,mysql对表级进行加锁解锁
加解锁时相对于连接而言的,而不是针对线程。
以下所述的线程均是发起一个单独连接的线程。在多线程的mysql程序中,最好是一个线程发起一个链接,否则有隐患。

多线程共享一个连接的话,两个线程同时去操作一个表,会有异常。那么能否在多个连接上同时操作同一张数据表?
我遇到这样一个问题:
在数据库上建立多个连接,所有连接都更新同一张数据库表。其中,不同的连接是在不同的进程或线程中完成的,执行的操作是 INSERT。
这样的操作是否行得通?

------解决方案--------------------------------------------------------
可以执行,MYSQL会自动加锁控制

refer to http://www.myexception.cn/mysql/206922.html

经过测试可以。那就没必要手动表锁了,如下。


锁定表Bind 
LOCK TABLES Bind READ;
之后所有线程(包括执行加锁的线程本身)均可读取表Bind ,但均不能写入表Bind 

锁定表Bind 
LOCK TABLES Bind WRITE;
之后只有本线程可读取和写入表Bind ,其他不能读也不能写入表Bind (使用select * from t 测试之)

解除本线程对所有表加的所有锁,无法解除其他线程加的锁;线程没有加锁退出时,其所加锁自动解除。
UNLOCK TABLES

	string sSql="LOCK TABLES Bind WRITE";
	if(!pDB->exec(sSql))
	{
		DBGMYSQL("%s failed",sSql.c_str());
	}
	else
	{
		DBGMYSQL("%s success",sSql.c_str());
	}



查看当前所有连接
 SHOW PROCESSLIST;
获取表的记录条数
SELECT COUNT(Cur) AS num FROM DevLog_Value

http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html
posted on 2013-06-13 14:57  _song  阅读(351)  评论(0编辑  收藏  举报