mysql中的独占读锁

时间:2014-06-05 06:25:07

标签: mysql sql

我有一个表来维护和分配输入的部分(从一个大的输入表),用于进程的多个实例。该表的组织如下:

BlockInfo Table
---------------
BlockID int primary key
Status  varchar 

每个进程都会查询它应该采取的输入块以及阻塞的进程。

我期待查询如下:

select BlockID 
from BlockInfo 
order by BlockID 
where Status='available' 
limit 1

对于这种效果,我要求服务器维护独占读锁,因为如果要将读锁保持为共享,那么多个实例可能会获得相同的块,这会导致重复努力并且是不可取的。

我可以获得一个独占的写锁,但实际上并没有写任何东西。但我想知道mysql是否允许独占读锁。

了解实施此方法的其他方法也很有帮助。

2 个答案:

答案 0 :(得分:0)

你应该做的是:

  1. 获取独家写锁
  2. 选择要处理的行
  3. 将其状态更改为"处理" (或"可用"以外的其他东西)
  4. 解锁表格
  5. 对该行进行所有处理
  6. 更新行以将其状态更改回"可用"
  7. 这将允许其他进程同时处理其他行。它使表保持锁定足够的时间,以防止它们尝试在同一行上工作。

答案 1 :(得分:0)

如果要在数据库级别实现此目的,则可以使用表级锁定,如另一个答案中所述。但如果性能与您的应用程序有关,那将是一个糟糕的设计。这将导致频繁的表锁定和等待。

我建议你把工作分成应用程序。

让一个进程从数据库中读取可用的行,并填充将处理它们的工作进程的队列。