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