【问题标题】:Question on locking and transactions on MyISAM tableMyISAM 表上的锁定和事务问题
【发布时间】:2023-12-26 18:43:01
【问题描述】:

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

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

【问题讨论】:

    标签: mysql database transactions locking


    【解决方案1】:

    MyISAM 表不支持事务 - START TRANSACTIONCOMMIT 什么都不做。

    你可以使用LOCK TABLES:

    LOCK TABLES mytable READ;
    ...
    UNLOCK TABLES;
    

    【讨论】:

    • 感谢您的回复。这是真的。似乎是我的网络服务器被阻止(Apache)并且无法同时进行 2 个查询。很奇怪。