多个进程轮询mysql并更新数据

时间:2017-05-19 04:32:57

标签: mysql node.js

我遇到了让mysql和我的nodejs应用程序很好地一起玩的问题。基本上,我有两个nodejs“客户端”,它们为50行数据轮询mysql表。但是,我不希望他们轮询相同的50行。一旦一个客户端拥有50行数据,它就会执行一些基本操作并旋转一些bash脚本。这可能需要几秒钟。表中更新了所有50行数据,以指示那些行在该客户端上“正在使用”。

问题是,在某些情况下,两个客户端同时请求并接收相同的50行。如何/我可以安全地使用innodb锁来锁定那些行被任何其他客户端读取/使用?即使可能需要几秒钟才能确保行数据已成功启动脚本?

我有点茫然,需要一些指示。

3 个答案:

答案 0 :(得分:1)

您正在寻找的是

SELECT columnName FROM tableName FOR UPDATE;

这将选择一行并将其锁定,以便另一个同时连接无法选择它。

请参阅MySql doc Here

答案 1 :(得分:0)

你可以使用redis lock来执行这样的任务。

例如:设置页面大小= 50;如果你想从100获得记录; size = 50;例如,你需要获得锁locks:row:100

https://www.npmjs.com/package/redlock

const resource = 'locks:row:100'
const ttl = 1000

redlock.lock(resource, ttl).then(function(lock) {
    // DO STUFF

    return lock.unlock()
        .catch(function(err) {
            console.error(err)
        })
})

答案 2 :(得分:0)

另一种可能的解决方案 你提到。

  

表中更新了所有50行数据以指示这些行   是"在使用"在那个客户端。

我想知道你究竟是如何做这一步的......看来这种方法应该是正确的。

我会先做

UPDATE tableName 
SET lockColumnName='jnodeClientGUID' 
WHERE lockColumnName IS NULL
LIMIT 50

然后你可以安全地做

SELECT * 
FROM tableName
WHERE lockColumnName = 'jnodeClientGUID'

然后你必须妥善管理记录的解锁,但是这会让你在几秒钟内锁定记录,并且应该消除竞争状况的问题。

虽然我不确定这是最有效的方式。