MemSql > SELECT 的解决方法 ... 更新

MemSql > workaround for SELECT ... FOR UPDATE

我正在使用 MemSql 作为我的数据库,我需要 SELECT ... FOR UPDATE 功能。但是,我正在使用的 6.5 版本不支持它。这个问题有解决办法吗?

我的问题如下:多个进程从同一个 table 中挑选一条记录(尚未处理),用 SQL 代码做一些工作然后做更新标记处理的记录。如果我有可能做 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';

但在这种情况下我得到

Error Code: 1749. Feature 'UPDATE...LIMIT must be constrained to a single partition' is not supported by MemSQL Distributed.

我也可以用 LOCK TABLES 完成这项工作,但据 this 称,它们也不被支持。

是否有解决此类问题的方法?

是的,您的解决方法是个好主意。解决该错误的一种方法是选择要锁定的特定行,而不是使用 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 版,其中 select 现在支持更新:https://docs.memsql.com/sql-reference/v6.7/select/