我有以下设置:
- 通过Hibernate(4.1)使用JPA(2.0)
- Infinispan作为第二级缓存(5.1)
- 连接到Hibernate(4.1)的Hibernate Search
- Infinispan作为Hibernate Search(Lucene)的目录
- 为Infinispan目录连接了一个JDBC CacheStore
- PostgreSQL(9.1)数据库用于存储实体和Lucene目录。
- Bitronix(2.1.2)作为事务管理器
- 我没有使用Java EE,而是使用Spring(3.1)
Infinispan作为第二级缓存很好,不需要恢复,并且由于缓存的本质,您可以在自己的事务中读取更改。
经过数小时的阅读源代码,当我更新实体时,Hibernate Search没有更新Lucene目录,但在事务结束时(如果提交),它会进行更新,因此,如果我想在同一事务内搜索刚刚更新的文本,我就不能做到吗?
但是,Hibernate Search将在不同的线程中对目录进行更新,事务完成后。因此,如果其中一个目录更新失败,则Lucene将与我的实体不一致?如果在更新被分派到目录之前发生了什么,并且需要恢复,那些更新会丢失吗?
假设此“第一”事务成功提交,更新已发送到Infinispan目录。在此处启动新的事务。由谁启动?Lucene有使用JMS发送更新的选项。让我们说该选项已激活,因此JMS消息初始化了新事务。
Infinispan将根据其接收到的更新修改其内存目录,但是持久CacheStore将在此事务完成后再次进行更新,即提交后。因此,如果在更新jdbc CacheStore时发生任何事情,则可能会导致其不具有更新,但是Infinispan Memory Directory将应用这些更新。
我的问题是,考虑到我正在使用的所有模块都支持事务,并且它们甚至支持加入全局事务(XA),是否有一种实现真正事务性的方法?也许我只是没有看到它。