如何使用 java 客户端通过 tarantool 的辅助键删除记录?
How to delete a record by the secondary key for tarantool using java client?
Java 客户来源
函数 select 有索引:
public java.util.List select(int space, int index, java.lang.Object key, int offset, int limit, int iterator)
但替换、更新和删除仅给定 space & key:
public java.util.List delete(int space, java.lang.Object key)
删除是在主键上执行的,因此它是一个原子操作,因为主键强制执行唯一性。二级索引可能是唯一的,但也可能不是唯一的,因此您需要启动事务以确保非唯一二级索引键中的原子性。所以这就是为什么 Java 的二级索引上还没有 delete/update/insert 的原因。 tarantool 是否允许远程启动事务是一个很好的问题,但我怀疑它是否有用。
因此您需要执行以下操作才能使其正常工作:
- 在 Lua 中编写一个存储过程来迭代你的 index/select 你需要的值
- 将您编写的程序放入您的 Tarantool 实例中
- 使用
public List call(String var1, Object... var2);
从您的 Java 代码按名称调用它
例如
-- Lua function
function deleteFromSpaceByUniqueSecondaryIndex(secondaryId)
box.space.YourSpace.index.yourSecondaryIdx:delete(secondaryId)
end
.....
//call it from Java like that
tarantoolConn.call("deleteFromSpaceByUniqueSecondaryIndex", secondaryId);
Java 客户来源
函数 select 有索引:
public java.util.List select(int space, int index, java.lang.Object key, int offset, int limit, int iterator)
但替换、更新和删除仅给定 space & key:
public java.util.List delete(int space, java.lang.Object key)
删除是在主键上执行的,因此它是一个原子操作,因为主键强制执行唯一性。二级索引可能是唯一的,但也可能不是唯一的,因此您需要启动事务以确保非唯一二级索引键中的原子性。所以这就是为什么 Java 的二级索引上还没有 delete/update/insert 的原因。 tarantool 是否允许远程启动事务是一个很好的问题,但我怀疑它是否有用。
因此您需要执行以下操作才能使其正常工作:
- 在 Lua 中编写一个存储过程来迭代你的 index/select 你需要的值
- 将您编写的程序放入您的 Tarantool 实例中
- 使用
public List call(String var1, Object... var2);
从您的 Java 代码按名称调用它
例如
-- Lua function
function deleteFromSpaceByUniqueSecondaryIndex(secondaryId)
box.space.YourSpace.index.yourSecondaryIdx:delete(secondaryId)
end
.....
//call it from Java like that
tarantoolConn.call("deleteFromSpaceByUniqueSecondaryIndex", secondaryId);