代码之家  ›  专栏  ›  技术社区  ›  nightcoder

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

  •  1
  • nightcoder  · 技术社区  · 15 年前

    我在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 回复  |  直到 15 年前
        1
  •  5
  •   Greg    15 年前

    myisam表不支持事务- START TRANSACTION COMMIT 什么也不做。

    你可以使用 LOCK TABLES :

    LOCK TABLES mytable READ;
    ...
    UNLOCK TABLES;