如果它是全球交易的一部分,我如何使用Jackrabbit?

时间:2013-09-03 21:00:15

标签: java spring transactions jackrabbit jcr

我正在使用带有数据存储区的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配置不正确?

1 个答案:

答案 0 :(得分:0)

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协议,并且需要下面的非XA数据源”,这意味着行为你看到了。

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

@Transactional
public void addContent() {
    try {
        storeContentInJcrRepo();
        saveMetadataInDatabase();
    catch (DataAccessException e) {
        deleteNewlyStoredContentFromJcrRepo();
        // Rethrow to ensure DB transaction is rolled back
        throw e;
    }
}