是否可以强制Hazelcast在调用线程上的TransactionalMap上运行put(),replace()和delete()方法?我希望XA事务从写入到Hazelcast继续写入到MapStore中的数据库,但是Hazelcast将更改排队到其他线程上运行,因此它们不在同一个事务上下文中。
我已将其设置为直写持久性,但我发现它将TxnSetOperation排队并在单独的线程上运行它们。
这是一个Spring Boot应用程序,它使用Hazelcast自动配置,并支持PostgreSQL的JPA / Hibernate存储。
答案 0 :(得分:0)
MapStore
个操作不会在同一个事务上下文中运行。如果您希望使用Hazelcast进行事务性持久更新,则需要使用XA事务而不启用MapStore
。然后,您可以将持久性存储设置为上下文中的不同XA资源。您可以查看Hazelcast参考手册中的相关部分:http://docs.hazelcast.org/docs/latest/manual/html-single/index.html#providing-xa-transactions
答案 1 :(得分:0)
Alsparlan的回答是部分正确的,但是没有办法在MapStore中使用与对Hazelcast TransactionalMap相同的事务上下文来登记资源。他提供的链接不讨论这个(不幸的是),但Javadoc for TransactionalMap确实:
使用MapStore时,对任何MapStore方法的调用都在事务边界之外。如果您需要跨越Hazelcast操作的XATransaction和另外一个XAResources(例如数据库),则不应使用MapStore。相反,在事务中登记两个资源
我删除了我的MapStore用法并将我的Spring Boot存储库直接连接到我的服务中,因此我可以在同一事务中使用相同的服务方法对Hazelcast和我的数据源进行更改。与this solution一起声明性地征集Hazelcast XAResource,这对我来说很有用。