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

nig*_*der 1 mysql database locking transactions

我在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; 
Run Code Online (Sandbox Code Playgroud)

据我所知,在MyISAM中,整个表应该被锁定,直到交易结束.当我从PHP启动并发查询,在浏览器中打开脚本时,它确实等待锁定消失.但是,如果我使用mysql.exe从表中选择所有记录 - 即使仍然保持锁定,它也会选择所有记录.

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

Gre*_*reg 5

MyISAM表不支持事务 - START TRANSACTION并且COMMIT什么也不做.

您可以使用LOCK TABLES:

LOCK TABLES mytable READ;
...
UNLOCK TABLES;
Run Code Online (Sandbox Code Playgroud)