我遇到了让mysql和我的nodejs应用程序很好地一起玩的问题。基本上,我有两个nodejs“客户端”,它们为50行数据轮询mysql表。但是,我不希望他们轮询相同的50行。一旦一个客户端拥有50行数据,它就会执行一些基本操作并旋转一些bash脚本。这可能需要几秒钟。表中更新了所有50行数据,以指示那些行在该客户端上“正在使用”。
问题是,在某些情况下,两个客户端同时请求并接收相同的50行。如何/我可以安全地使用innodb锁来锁定那些行被任何其他客户端读取/使用?即使可能需要几秒钟才能确保行数据已成功启动脚本?
我有点茫然,需要一些指示。
答案 0 :(得分:1)
答案 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'
然后你必须妥善管理记录的解锁,但是这会让你在几秒钟内锁定记录,并且应该消除竞争状况的问题。
虽然我不确定这是最有效的方式。