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
查看当前所有连接
SHOW PROCESSLIST;
获取表的记录条数
SELECT COUNT(Cur) AS num FROM DevLog_Value
http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html
加解锁时相对于连接而言的,而不是针对线程。
以下所述的线程均是发起一个单独连接的线程。在多线程的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