Apache Ignite在事务模式下全部删除,导致节点故障

时间:2019-01-28 07:13:17

标签: java apache transactions ignite in-memory-database

我想从缓存中删除大约30L(30,000,000)个数据记录,并且我使用了#igniteCache.removeAll(listOfKeys) 在这里,我正在获取密钥并传递给ignite的removeAll方法,并且工作正常。但是为了保持一致性并避免部分删除,我决定在操作中使用事务。但是问题在于:删除它需要花费很多时间,并且主要是我的ignite服务器节点已停止。

        IgniteTransactions transactions = IgniteConfig.getIgnite().transactions();
        tx = transactions.txStart();
        IgniteCache<String, myCache> igniteCache = 
IgniteConfig.getIgniteCache();
FieldsQueryCursor<List<?>> deletedKeys = igniteCache.query("select id from  
mytable where timeId=xxxx");

Set<String> listOfKeys = new HashSet<>();
List<List<?>> allData = deletedKeys.getAll();

for (List keys : allData) {                  
listOfKeys.add(String.valueOf(keys.get(0)));
}

igniteCache.removeAll(listOfKeys);
tx.commit();

1 个答案:

答案 0 :(得分:0)

默认并发级别为TransactionConcurrency.PESSIMISTIC,依此类推

  igniteCache.removeAll(listOfKeys);

call Ignite将首先锁定所有这些键,然后在进行tx提交时将其删除。

我认为在您的情况下,如果需要以事务方式执行此操作,则需要删除SQL中的所有这些键,可以使用2.7版中引入的事务SQL: https://apacheignite-sql.readme.io/docs/transactions

此外,您可以将事务并发更改为OPTIMISTIC,这将大大减少事务处理时间。