【发布时间】:2016-02-10 16:33:25
【问题描述】:
Hazelcast 的文档说 MapStore/QueueStore 不参与事务。 我想知道,您通常如何解决这个问题?您是否承认在提交阶段保留值期间可能会发生一些潜在的不良情况并决定忽略它,或者您是否针对该特定问题实施了解决方案?
我了解问题本身背后的风险,只是想了解有哪些选择可以缓解它。
另外,如果有人真的认为它是一个重要的优先事项,那么如果你可以分享一些代码,作为一个例子,那将是完美的。
谢谢, 康拉德
【问题讨论】:
Hazelcast 的文档说 MapStore/QueueStore 不参与事务。 我想知道,您通常如何解决这个问题?您是否承认在提交阶段保留值期间可能会发生一些潜在的不良情况并决定忽略它,或者您是否针对该特定问题实施了解决方案?
我了解问题本身背后的风险,只是想了解有哪些选择可以缓解它。
另外,如果有人真的认为它是一个重要的优先事项,那么如果你可以分享一些代码,作为一个例子,那将是完美的。
谢谢, 康拉德
【问题讨论】:
根据TransactionalMap的javaDoc
如果您需要一个跨 Hazelcast 操作和一个其他 XAResources(例如数据库)的 XATransaction,则不应使用 MapStore。相反,在事务中征用这两种资源
这是来自该 javaDoc 的示例 sn-p,它可以为您提供一些想法来实现所需的解决方案。
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();
}
【讨论】: