让我看看我是否正确理解这一点。通常情况下,我们应该努力将属于一个“工作单位”的所有业务置于同一交易中,对吧?这有助于在操作链的某处出现异常时恢复数据库的状态。
但是,在我的特定情况下,我有一个旧服务,这不是很容易插入我当前的代码。因此,我必须让它单独运行,并赋予它当前应用程序存储数据的同一数据库的权限。
当我必须将新项目插入数据库时,问题就出现了。然后我必须打电话给服务。如果我在一个事务下执行此操作,则服务将在事务实际提交之前开始在数据库中查找记录。因此,我开始使用事件侦听器,即PostInsertEventListener和PostDeleteEventListener。
现在它工作正常,因为事务事先提交,但这完全破坏了我的代码架构。我已经建立了一系列相互注入的服务,现在我必须声明这两个监听器类。我想,我能做的最好的事情就是让我的协调器服务实现这两个监听器接口,但是这样我完全把它耦合到Hibernate,对吧?
一般来说,对于像我这样的案件,使用那些听众真的是正确的方法吗?
答案 0 :(得分:2)
我不知道你是怎么来自“我需要在调用外部服务之前提交事务”到“我决定使用监听器”。
为什么不简单地使用以下代码:
public void someNonTransactionalMethod() {
someTransactionalService.insertThingsInDatabase();
externalService.foo();
}
或
public void someMethod() {
someTransactionalService.insertThingsInDatabase();
externalService.foo();
}
insertThingsInDatabase
使用REQUIRES_NEW
传播类型?