Hazelcast MapStore和交易

时间:2016-02-10 16:33:25

标签: transactions hazelcast

Hazelcast'文档说MapStore / QueueStore不参与事务。 我在想,你一般如何处理这个问题?您是否承认在提交阶段持久保存值并决定忽略它,或者您是否针对该特定问题实施解决方案时可能会发生可能不好的事情?

我理解问题背后的风险,只是想了解哪些选项可以缓解它。

此外,如果有人真的认为它是一个重要的优先事项,那么如果你可以分享一些代码就是完美的,就像一个例子。

谢谢, 康拉德

1 个答案:

答案 0 :(得分:2)

根据TransactionalMap

的javaDoc
  

如果您需要跨越Hazelcast操作的XATransaction和另外一个XAResources(例如数据库),则不应使用MapStore。相反,在事务中登记两个资源

这是来自javaDoc的示例片段,可以为您提供实现所需解决方案的一些想法。

HazelcastInstanceclient=HazelcastClient.newHazelcastClient();

UserTransactionManagertm=newUserTransactionManager();
tm.setTransactionTimeout(60);
tm.begin();


HazelcastXAResourcexaResource=client.getXAResource();
Transactiontransaction=tm.getTransaction();
transaction.enlistResource(xaResource);

//you can enlist more resources here like a database XAResource
try{
TransactionContextcontext=xaResource.getTransactionContext()
TransactionalMapmap=context.getMap("map");
map.put("key","value");
final TransactionalQueue queue=context.getQueue("queue");
queue.offer("item");

//you can do other resource operations like store/delete to a database

transaction.delistResource(xaResource,XAResource.TMSUCCESS);
tm.commit();
}catch(Throwablet){
t.printStackTrace();
transaction.delistResource(xaResource,XAResource.TMFAIL);
tm.rollback();
}