java - 当 Jackrabbit 是全局交易的一部分时,我该如何使用它?

标签 java spring transactions jackrabbit jcr

我正在将 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/

相关文章:

java - 重构具有大量级别之间依赖关系的内部循环

java - hibernate 中的 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException

javascript - Wicket 口:StalePageException

java - Tomcat:不允许对锁定的 ParameterMap 进行修改

java - 如何配置 spring-boot 项目与内存空间数据库一起进行测试?

MySQL如何正确使用事务?

java - 如何在android中从ExpandableListView获取onChildClick、groupPosition和childPosition?

java - 是否存在可以接受使用构造函数调用创建的 Spring bean 的用例?

hibernate - 如何使我的 pojo 具有事务性?

java - 理解 Spring 事务——当一个事务方法调用另一个事务方法时会发生什么?