【问题标题】:How to lock a row for select in MySQL [duplicate]如何在MySQL中锁定一行以进行选择[重复]
【发布时间】:2013-03-05 18:06:42
【问题描述】:

一个程序会从一个表中选择几条记录并更新每一行,而它可以执行多次,这将导致多个进程同时完成同一个任务。

如何防止两个不同的进程更新表中的同一行。也就是说,如何保证每个进程可以选择不同的记录呢? MySQL 中的行选择级别是否有任何锁?或者在这种情况下,有没有更好的方案来防止单行多次更新?

【问题讨论】:

  • TRANSACTIONS,INNODB找这两个
  • @swapnesh 我试过 INNODB,事务。当一个进程启动事务时,use lock in share mode 不会阻止另一个进程获取同一行,而只是将其锁定以不更新和删除。
  • @JoachimIsaksson 该解决方案可能有弱点。如果两个进程几乎同时运行,是否存在第二个进程在行status字段更改之前获取列表的可能性?

标签: mysql locks


【解决方案1】:

您可以使用SELECT FOR UPDATE。在您的事务中,开始选择您要“锁定”的行,如下所示:

 SELECT * from TABLE where id = 123 FOR UPDATE;

如果两个不同的事务尝试同时执行此操作,MySQL 将使第二个事务等待,直到第一个事务提交。这样,您就可以确保第二个事务只在第一个事务完成后才查看该行。

【讨论】:

  • 谢谢。也许我应该改变我的程序的逻辑来逐个获取行,而不是先获取列表,因为我希望这种队列可以由多个进程处理,而不是一个等待其他进程的队列。
猜你喜欢
  • 2017-04-13
  • 2016-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-27
相关资源
最近更新 更多