我正在使用MemSql作为数据库,我需要具有SELECT ... FOR UPDATE
功能。但是,我正在使用的6.5版本不支持它。有没有解决此问题的方法?
我的问题如下:多个进程从同一张表中选择一条记录(尚未处理过),用SQL代码做一些工作,然后执行UPDATE将记录标记为已处理。如果我有可能做SELECT ... FOR UPDATE
,那么我可以锁定记录以确保只有一个进程可以选择它。
作为我可以想到的解决方法,使用一些LockToken列并执行
UPDATE Tbl SET LockToken = 'a_unique_token' WHERE LockToken IS NULL LIMIT 1;
SELECT * FROM Tbl WHERE LockToken = 'a_unique_token';
但在这种情况下,我得到了
错误代码:1749。MemSQL Distributed不支持功能'UPDATE ... LIMIT必须限制为单个分区'。
我也可以使用LOCK TABLES
来完成这项工作,但是根据this,他们也不被支持。
有没有解决此类问题的方法?
答案 0 :(得分:0)
是的,您的解决方法是一个好主意。解决该错误的一种方法是选择要锁定的特定行,而不是使用LIMIT 1,例如UPDATE Tbl SET LockToken = 'a_unique_token' WHERE LockToken IS NULL and id = (select id from Tbl WHERE LockToken IS NULL limit 1)
。 (或者,您可以根据自己的需要使用(select min(id) from Tbl WHERE LockToken IS NULL)
或类似的方法来选择一个id。)如果您在id上有索引,这应该可以很好地工作。
此外,您可以签出6.7版,其中现在支持选择更新:https://docs.memsql.com/sql-reference/v6.7/select/。