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/。
我正在使用 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/。