我在myisam表中有一个计数器字段。要在多任务环境(Web服务器,来自PHP的并发查询)中更新计数器值,我需要锁定记录以进行更新。 所以我这样做:
START TRANSACTION;
SELECT Counter FROM mytable ... FOR UPDATE;
UPDATE Counter value or INSERT INTO mytable;
// let's make sleep for 20 seconds here to make transaction longer
COMMIT;
据我所知,在MyISAM中,整个表应该被锁定,直到交易结束。 当我从PHP启动并发查询,在浏览器中打开脚本时,它确实等待锁定消失。 但是,如果我使用mysql.exe从表中选择所有记录 - 即使仍然保持锁定,它也会选择所有记录。
所以我似乎不明白。请解释一下这种行为。
答案 0 :(得分:5)
MyISAM表不支持交易 - START TRANSACTION
和COMMIT
不执行任何操作。
您可以使用LOCK TABLES:
LOCK TABLES mytable READ;
...
UNLOCK TABLES;