3

我将 Jackrabbit 与数据存储和一个单独的数据库一起用于我的其余数据。我已将 Jackrabbit JCA 部署到 JBoss 7.1.1。我已经调试了应用程序,我看到会话实例的类型是XASessionImpl.

我目前正在接受这样的会议:

    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 配置不正确?

4

1 回答 1

0

Jackrabbit 可能正在运行自己的事务,假设 Spring 管理的事务已回滚但数据存储中的内容仍然存在。您的 Spring/JBoss 资源配置如何?

一些快速的谷歌搜索(使用关键字 JTA Jackrabbit Spring JBoss)表明,使用 Jackrabbit 和 XA JDBC 数据源设置 XA 事务可能说起来容易做起来难。旧的邮件列表条目报告说能够使用名为 Jencks 的 JTA 事务管理器来执行此操作,但 Jencks 的开发似乎已经停止。

还请查看此 JBoss 社区 wiki 页面中的第 1.2.3 节(尽管有一点盐),该页面指出“jackrabbit 在内部实现 XA 协议并需要在下面使用非 XA 数据源”,这意味着您的行为看到。

此外,作为 XA 的一个选项,您是否考虑过像这样模拟 XA(注意伪代码)?:

@Transactional
public void addContent() {
    try {
        storeContentInJcrRepo();
        saveMetadataInDatabase();
    catch (DataAccessException e) {
        deleteNewlyStoredContentFromJcrRepo();
        // Rethrow to ensure DB transaction is rolled back
        throw e;
    }
}
于 2013-09-11T18:50:55.827 回答