MemSql> SELECT ... FOR UPDATE

时间:2018-12-13 14:28:20

标签: select locking memsql

我正在使用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,他们也不被支持。

有没有解决此类问题的方法?

1 个答案:

答案 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/