我正在尝试使用 Spring 提供的声明性事务管理功能。我已经按照参考文档中的描述设置了 spring 配置和 bean(即包括 AOP、tx 命名空间和使用<tx:annotation-driven />
标签),并且在我想要成为事务性的方法上使用了 @Transactional 注释。
这是代码的样子:
public interface Worker {
public workOnEvents(List<Events> eventsForACustomer);
}
public class WorkerImpl {
@Transactional
public workOnEvents(List<Events> eventsForACustomer) {
for(Event event : eventsForACustomer) {
// get DAO's based on event types at runtime,
// so we will have different DAO's acting within this loop
DAOFactory.getDAO(event.getType()).persistEvent(event);
}
}
}
现在,我希望如果上述循环中的任何 DAO 无法处理该事件,那么在此之前进入循环的其他 DAO 对数据库所做的所有更改都应该回滚。
因此,为了测试回滚,我列出了一些事件的列表,例如 (e1, e2, e3),这会导致拾取 DAO,例如 (d1, d2, d3),然后我故意在persistEvent 方法中抛出运行时异常道 d2。但是,我得到的结果是程序终止而没有转到循环中的事件 e3,也没有处理抛出的异常。此外,DAO d1 持久化的数据不会回滚。
请让我知道我在这里做错了什么?