在事务和事件侦听器上

时间:2012-01-31 08:58:06

标签: java hibernate spring transactions

让我看看我是否正确理解这一点。通常情况下,我们应该努力将属于一个“工作单位”的所有业务置于同一交易中,对吧?这有助于在操作链的某处出现异常时恢复数据库的状态。

但是,在我的特定情况下,我有一个旧服务,这不是很容易插入我当前的代码。因此,我必须让它单独运行,并赋予它当前应用程序存储数据的同一数据库的权限。

当我必须将新项目插入数据库时​​,问题就出现了。然后我必须打电话给服务。如果我在一个事务下执行此操作,则服务将在事务实际提交之前开始在数据库中查找记录。因此,我开始使用事件侦听器,即PostInsertEventListener和PostDeleteEventListener。

现在它工作正常,因为事务事先提交,但这完全破坏了我的代码架构。我已经建立了一系列相互注入的服务,现在我必须声明这两个监听器类。我想,我能做的最好的事情就是让我的协调器服务实现这两个监听器接口,但是这样我完全把它耦合到Hibernate,对吧?

一般来说,对于像我这样的案件,使用那些听众真的是正确的方法吗?

1 个答案:

答案 0 :(得分:2)

我不知道你是怎么来自“我需要在调用外部服务之前提交事务”“我决定使用监听器”

为什么不简单地使用以下代码:

public void someNonTransactionalMethod() {
    someTransactionalService.insertThingsInDatabase();
    externalService.foo();
}

public void someMethod() {
    someTransactionalService.insertThingsInDatabase();
    externalService.foo();
}

insertThingsInDatabase使用REQUIRES_NEW传播类型?