如何在Tarantool DB中使用唯一保证获取1条记录?

我的DB中有一个表my_table_ext [ID, CITY_ID, CTN, EXT, InUse]

有如下数据

{1,'City1','001','1234',0}
{2,'City1','001','3456',0}

在MSSQL中我有如下SQL代码用于返回更新参数InUse(0>1)的唯一记录

  update A set A.InUse=1
    output inserted.ID,inserted.CTN,inserted.EXT
     into @ext (EXT_ID,CTN,EXT)
    from
     (select top 1 ID,CTN,EXT,InUse from
       my_table_ext with(readpast)
       where CITY_ID=@city_id  and InUse=0
       ) A
    where ID=A.ID

问题是 - 如何在Lua/Tarantool中重复此操作?

点赞
用户13626536
用户13626536

在 Tarantool 中,您可以使用 box.execute() 执行 SQL 语句。Tarantool 中使用的 SQL 方言源自 SQLite,因此像您示例中的子查询一样的语句是支持的。

不幸的是,不支持 OUTPUT 子句。您将不得不将查询拆分为 UPDATE 和 SELECT。由于这一切都是在内存中完成的,因此开销不会显著。

如果您想让这两个查询成为原子操作,您可以在事务中同时执行它们。要了解有关在 Tarantool 中使用 MVCC 的更多信息,请查看此回答:Can I yield during an transaction in Tarantool?

2020-10-12 09:28:45