我正在将 Jackrabbit 与数据存储一起使用,并为其余数据使用单独的数据库。我已将 Jackrabbit JCA 部署到 JBoss 7.1.1。我已经调试了该应用程序,并且看到 session 实例的类型为 XASessionImpl。
我目前正在进行这样的 session :
final Credentials credentials = new SimpleCredentials("admin", "admin".toCharArray());
try {
final Session session = repository.login(credentials);
return session;
} catch (RepositoryException e) {
throw new RuntimeException(e);
}
每次访问完成后,我都会调用 session.save();
,然后调用 session.logout()
。当它是全局事务的一部分时,这是正确的吗?我对分布式事务等了解不多,如果我错了,请纠正我。我尝试在用 @Transactional 注释的方法之一(使用 Spring 3.2)中引发运行时异常,但数据存储区中的数据并未被删除。它是否正确?如果事务回滚,数据存储中添加的数据是否会被删除?我的“测试”环境是:将内容添加到 Jackrabbit,然后添加到数据库,然后抛出运行时异常。或者 Jackrabbit 配置不正确?
最佳答案
Jackrabbit 可能正在运行自己的事务,假设 Spring 管理的事务已回滚,但数据存储中的内容仍然存在。您的 Spring/JBoss 资源配置如何?
一些快速谷歌搜索(使用关键字 JTA Jackrabbit Spring JBoss)显示,使用 Jackrabbit 和 XA JDBC 数据源设置 XA 事务可能说起来容易做起来难。旧的邮件列表条目报告能够使用名为 Jencks 的 JTA 事务管理器来执行此操作,但 Jencks 的开发似乎已停止。
还可以看看(尽管持保留态度)this JBoss community wiki page 中的 1.2.3 节。其中指出“jackrabbit 在内部实现 XA 协议(protocol),并且需要底层的非 XA 数据源”,这意味着您所看到的行为。
此外,作为 XA 的一个选项,您是否考虑过像这样模拟 XA(注意伪代码)?:
@Transactional
public void addContent() {
try {
storeContentInJcrRepo();
saveMetadataInDatabase();
catch (DataAccessException e) {
deleteNewlyStoredContentFromJcrRepo();
// Rethrow to ensure DB transaction is rolled back
throw e;
}
}
关于java - 当 Jackrabbit 是全局交易的一部分时,我该如何使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18601405/