首页 > 解决方案 > MemSql > SELECT ... FOR UPDATE 的解决方法

问题描述

我使用 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 不支持功能“更新...限制必须限制在单个分区”。

我也可以使用 来完成这项工作LOCK TABLES,但据此它们也不受支持。

这类问题有什么解决方法吗?

标签: selectlockingsinglestore

解决方案


是的,您的解决方法是个好主意。解决该错误的一种方法是选择要锁定的特定行,而不是使用 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 的索引,这应该很好用。

此外,您可以查看现在支持 select for update 的版本 6.7:https ://docs.memsql.com/sql-reference/v6.7/select/ 。


推荐阅读