删除多个密钥——它可以是事务性的吗?
Deleting multiple keys -- can it be transactional?
这是我们的代码:
@Override
public boolean delete(String instance, final String storeName, String... keys) {
final Boolean[] isSuccess = {false};
final List<String> keyList = Arrays.asList(keys);
final Environment env = Environments.newInstance(xodusRoot + instance);
env.executeInTransaction(new TransactionalExecutable() {
@Override
public void execute(@NotNull final Transaction txn) {
final Store store = env.openStore(storeName, StoreConfig.WITHOUT_DUPLICATES, txn);
for (String key : keyList) {
isSuccess[0] = store.delete(txn, StringBinding.stringToEntry(key));
}
}
});
env.close();
return isSuccess[0];
}
我有两个问题。
- 这是事务性的,因为这个函数是为了删除多个
键,如果一个键无法删除其他键,这会像这样工作吗
不会被删除。全有还是全无?
- 万一txn中因为某些原因出现异常,比如key或者storeName为null,应该如何处理?或者这无关紧要,因为如果有异常,事务将失败并自动回滚?
Xodus 是一个符合 ACID 的事务数据库。除其他外,这意味着交易中数据的突变是一致的。在您的情况下,将删除所有指定的键(事务已提交)或没有键(事务中止)。如果事务因某种原因(异常,system/hardware 失败)中断,则不会修改任何内容,事务会自动回滚。
这是我们的代码:
@Override
public boolean delete(String instance, final String storeName, String... keys) {
final Boolean[] isSuccess = {false};
final List<String> keyList = Arrays.asList(keys);
final Environment env = Environments.newInstance(xodusRoot + instance);
env.executeInTransaction(new TransactionalExecutable() {
@Override
public void execute(@NotNull final Transaction txn) {
final Store store = env.openStore(storeName, StoreConfig.WITHOUT_DUPLICATES, txn);
for (String key : keyList) {
isSuccess[0] = store.delete(txn, StringBinding.stringToEntry(key));
}
}
});
env.close();
return isSuccess[0];
}
我有两个问题。
- 这是事务性的,因为这个函数是为了删除多个 键,如果一个键无法删除其他键,这会像这样工作吗 不会被删除。全有还是全无?
- 万一txn中因为某些原因出现异常,比如key或者storeName为null,应该如何处理?或者这无关紧要,因为如果有异常,事务将失败并自动回滚?
Xodus 是一个符合 ACID 的事务数据库。除其他外,这意味着交易中数据的突变是一致的。在您的情况下,将删除所有指定的键(事务已提交)或没有键(事务中止)。如果事务因某种原因(异常,system/hardware 失败)中断,则不会修改任何内容,事务会自动回滚。