select - 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
,但据此它们也不受支持。
这类问题有什么解决方法吗?
解决方案
是的,您的解决方法是个好主意。解决该错误的一种方法是选择要锁定的特定行,而不是使用 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/ 。
推荐阅读
- java - 如何将 Firestore 时间戳转换为 Java LocalDate?
- reactjs - 如何渲染页眉,页脚,菜单,仅一次且仅用于带有反应 js 的私有路由?
- python - 变量未添加到数组中
- mysql - 在 SQL 查询中需要帮助以检查是否有医生访问
- powerbi - 返回的错误:'OLE DB 或 ODBC 错误:[DataSource.Error] Teradata:[Teradata Database] [3119] 继续请求提交但没有响应返回
- nested-for-loop - 使用 trinket.io 嵌套 For 循环
- sql - 如何将多个 xml 元素提取到单个表中?
- php - 将 php 变量传递给 php 文件中的 CSS 代码
- amazon-web-services - 从 Amazon S3 路径读取 TFRecordfile
- spring - Spring Cloud 流“发现没有提交的偏移量”