【问题标题】:Mysql lock concurrent read/update of rowMysql锁并发读取/更新行
【发布时间】:2011-06-08 22:01:12
【问题描述】:

我有一张桌子,有很多(太多)要求从中选择一行。选择一行后,脚本运行更新查询来设置一个标志,即该行已被“选中”。但是由于每次请求太多,在一个线程选择一行并更新其标志之间的时间段内,另一个线程有时间选择同一行

选择查询从表中获取一行,按某个字段对其进行排序并使用 LIMIT 0、1。我需要该数据库跳过之前选择的行。

引擎是 InnoDB。

【问题讨论】:

    标签: php mysql concurrency innodb


    【解决方案1】:

    就在您开始交易之前,调用以下命令:

    SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
    

    这将确保如果您读取带有标志的行,当您在同一事务中更新它时,它仍然是这种方式。

    SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
    START TRANSACTION;
    
    SELECT id_site
    INTO @site
    FROM table1 WHERE flag = 0 ORDER BY field LIMIT 0,1;
    
    UPDATE table1 SET flag = 1 WHERE id_site = @site;
    
    COMMIT;
    

    【讨论】:

    • 我有 SELECT id_site, name FROM table1 WHERE flag = 0 ORDER BY field LIMIT 0,1 然后 UPDATE table1 SET flag = 1 WHERE id_site = :id_site 你看,第二个查询使用 id_site 值来自以前的。我怎样才能在一笔交易中做到这一点?
    • 我有这样的代码 pastebin.com/iWCUBs8P 但我有一个错误 SQLSTATE[HY000]: General error
    • 我建议将这样的代码块放入存储过程中
    猜你喜欢
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多