gpt4 book ai didi

java - 使用@Transactional 注解的问题

转载 作者:行者123 更新时间:2023-11-30 11:59:45 29 4
gpt4 key购买 nike

我正在尝试使用 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),然后我故意在DAO d2 的 persistEvent 方法。但是,我得到的结果是程序终止而没有继续执行循环中的事件 e3,也没有处理抛出的异常。此外,DAO d1 保留的数据不会回滚。

请让我知道我在这里做错了什么?

最佳答案

注释方法不会满足您对应该发生的事情的期望。它的工作方式是注释将方法标记为 Spring 应用建议的东西,建议包装方法,所以在调用方法之前可以发生一些事情,比如开始一个新的事务,在方法完成之后,比如提交或回滚交易。当您描述想要回滚 e1 和 e2 时,应该提交 e3,这将需要在方法中间执行事务代码,因此为此使用建议是行不通的。

对于您想要的交易控制级别,您将不得不求助于Spring's programmatic transaction API。 .

编辑:看了您的评论,我可能误解了您的意思。如果您可以确定一组您想要一起进入的事物,全部或全部,您可以将它们组合在一个标记为事务性的方法中,并有一个非事务性方法,该方法在具有异常处理的循环中调用该方法围绕事务方法的每次调用。

关于java - 使用@Transactional 注解的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2384803/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com