关于MyISAM表上的锁定和事务的问题

时间:2009-11-07 15:25:29

标签: mysql database transactions locking

我在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从表中选择所有记录 - 即使仍然保持锁定,它也会选择所有记录。

所以我似乎不明白。请解释一下这种行为。

1 个答案:

答案 0 :(得分:5)

MyISAM表不支持交易 - START TRANSACTIONCOMMIT不执行任何操作。

您可以使用LOCK TABLES

LOCK TABLES mytable READ;
...
UNLOCK TABLES;