要解决的一个应用是
执行一个业务逻辑时将表锁住,其他同时执行该业务逻辑的业务必须等当前占用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
分享到:
相关推荐
error 日志当中的记录: [ERROR] Fatal error: Can’t open and lock privilege tables: Table ‘mysql.host’ doesn’t exist 从发了帖子,只有人看,没有人回复,看到这种情况只能自己解决问题了,自己动手...
在MySQL数据库管理中,普通用户在执行数据库备份时可能会遇到权限问题,特别是在使用`mysqldump`工具进行备份时,如果用户没有`LOCK TABLES`权限,就会导致备份失败。这个问题通常会显示错误信息“Access denied for...
错误代码1100在MySQL数据库中表示"Table 't_depart_info' was not locked with LOCK TABLES",这个错误通常发生在尝试对一个未被显式锁定的表进行操作时,而该操作要求在锁定状态下执行。错误的出现是由于数据库在...
因此,如果在一个事务中使用`LOCK TABLES`,必须确保`AUTOCOMMIT`变量设置为0,以避免MySQL在调用`LOCK TABLES`后立即释放锁定,导致潜在的死锁问题。同样,开始一个新的事务,如`START TRANSACTION`,也会自动解锁...
Java代码 代码如下: mysqldump -h ‘114.212.111.123’ -uROSE -pxxxooo –opt –compress ITSM –skip-lock-tables | mysql -h localhost -uroot -proot ITSMC ********************格叽格叽1:不明真相的看下边**...
MySQL线程遇到“Opening tables”问题通常涉及到表缓存(table cache)的管理以及并发访问时的性能瓶颈。这个问题在MySQL 5.6.21版本的服务器中尤为突出,表现为并发线程Threads_running数量急剧增加,很多线程在...
在MySQL中,表级锁主要有两种:`LOCK TABLES`和`UNLOCK TABLES`。`LOCK TABLES`用于显式锁定表,指定用户可以对哪些表进行读写操作,其他用户则不能访问这些表。`UNLOCK TABLES`则用于解锁之前锁定的表,释放资源,...
9. lock语句:lock语句用于锁定mysql数据库中的表。示例:lock tables gushi write,gushizuozhe write 10. unlock语句:unlock语句用于释放mysql数据库中的锁定。示例:unlock tables MYSQL C API部分: 1. 数据...
### MySQL 服务无法启动 1067 的解决办法 在使用MySQL数据库的过程中,可能会遇到一个常见的问题:MySQL服务无法启动,并提示错误代码1067。错误代码1067通常表示“进程意外终止”,这可能是由于多种原因引起的。...
7.22 EXPLAIN (解释)句法(得到关于SELECT的信息) 7.23 DESCRIBE (描述)句法(得到列的信息) 7.24 LOCK TABLES/UNLOCK TABLES (锁定表/解锁表)句法 7.25 SET OPTION (设置选项)句法 7.26 ...
7.24 LOCK TABLES/UNLOCK TABLES (锁定表/解锁表)句法 7.25 SET OPTION (设置选项)句法 7.26 GRANT (授权)和REVOKE (撤回)句法 7.27 CREATE INDEX (创建索引)句法 7.28 DROP INDEX (抛弃索引)...
MySQL在进行alter table等DDL操作时,有时会出现Waiting for table metadata lock的等待场景。而且,一旦alter table TableA的操作停滞在Waiting for table metadata lock的状态,后续对TableA的任何操作(包括读)...
在 MySQL 5.6 中,如果有一张表被加了读锁(lock tables ... read),则不能使用 flush tables 命令,只能使用 flush tables table_name ... with read lock; 命令来关闭指定的表并清空指定表的缓存。 MySQL Flush ...
sql-mode = ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION,PIPES_AS_CONCAT slow_query_log = ON slow_query_log_file = /home/mysql/...
LOCK TABLES和UNLOCK TABLES语法 13.4.6. SET TRANSACTION语法 13.4.7. XA事务 13.5. 数据库管理语句 13.5.1. 账户管理语句 13.5.2. 表维护语句 13.5.3. SET语法 13.5.4. SHOW语法 13.5.5. 其它管理语句 13.6. 复制...
mysql tables in use 1, locked 11 lock struct(s), heap size 360, 0 row lock(s) MySQL thread id 19894045, OS thread handle 0x7f8cb7cf3700, query id 15242999467 10.8.92.22 ws_secevt02 update INSERT INTO ...
* 1 MySQL的一般的信息 o 1.1 什么是MySQL? o 1.2 关于本手册 + 1.2.1 本手册中使用的约定 o 1.3 MySQL的历史 o 1.4 MySQL的主要特征 o 1.5 MySQL稳定性? o 1.6 顺应2000年 o 1.7 SQL一般信息和教程 o ...
mysql中data文件的user表...如果你的mysql出现1067的启动错误,或者错误日志中出现Can't open and lock privilege tables: Table 'mysql.user' doesn't exist的问题。将这三个文件放入你mysql中的data>mysql目录下即可