java - 使用@Transactional 注解的问题

标签 java spring transactions rollback

我正在尝试使用 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/

相关文章:

java - Spring - 在请求处理程序中动态切换应用程序上下文

java - AOP、Spring 和事务范围界定

java - 意外回滚异常 : Transaction rolled back because it has been marked as rollback-only

java - 是否可以使用 AssistedInject 来注入(inject)构造函数之外的成员?

java - 使用数据库 MySQL 导出 eclipse java 桌面基础应用程序

java - 使用 Vaadin 生成缓慢的 HTML

spring - 在 Spring 应用程序中更新 Azure 总线上的消息锁定

java - 重构冗余的 if 语句

java - 请求未通过Spring安全链时访问认证对象

python - 在 Django-Rest-Framework 中,我如何使所有请求(GET 除外)都具有事务性?