gpt4 book ai didi

Spring事务不回滚

转载 作者:行者123 更新时间:2023-12-04 18:45:03 24 4
gpt4 key购买 nike

我们有一个 Spring Transaction 回滚问题,其中回滚似乎不起作用。

在我用 @Transactional 注释的服务层方法中我调用三个不同的DAOImpl插入 3 条记录的类。中间插入从第四个表中获取以填充描述字段,但这失败了。我希望第一个插入回滚,但它似乎没有发生。

几点:

  • “Get”方法引发运行时异常
  • 我们正在使用 org.springframework.jdbc.datasource.DataSourceTransactionManagerMySQL datasource定义于 applicationContext.xml . Bean 在 Beans.xml 中创建导入到 ApplicationContext.xml
  • 没有 @Transactional DAO 中的注释层
  • 我们使用了<tx:annotation-driven transaction-manager="transactionManager"/>再次在 applicationContext.xml
  • 我们正在使用 Spring 3.1

  • 更新 :

    代码片段....

    服务类- 这与我所拥有的类似......我在有和没有@Autowired 的情况下进行了测试。在服务类中调用事务启用方法。

    公共(public)类客户服务{

    //@自动连线
    CustomerOrderDAO customerOrderDAOImpl;
    //@自动连线
    CustomerItemDAO customerItemDAOImpl;
    //@自动连线
    CustomerPromotionDAO customerPromotionDAOImpl;
    //@自动连线
    推广DAO 推广DAOImpl;

    //其他变量

    公共(public)客户订单handleIncomingOrders(客户订单客户订单){
    尝试 {
    saveOrderDetails(customerOrder);
    ......
    返回客户订单;
    } catch (Exception e)//TO-DO 捕获正确的异常
    {
    //发送错误响应
    …………
    返回客户订单;
    }
    }

    @Transactional
    公共(public)无效 saveOrderDetails(CustomerOrder customerOrder) 抛出异常 {
    customerOrderDAOImpl.create(customerOrder);
    ……
    while (promotionsIterator.hasNext()) {
    customerPromotion.setPromotionName(promotionDAOImpl.getName(customerOrder.getPromotionId));
    customerPromotionDAOImpl.create(customerPromotion);
    }
    ……
    while (customerItemIterator.hasNext()) {
    customerItemDAOImpl.create(customerItem);
    }

    }
    }

    任何的想法?
    谢谢。

    最佳答案

    @Transactional 的默认行为是在对象周围添加了事务行为(CustomerService 在您的示例中)。来自 reference docs (向下滚动):

    In proxy mode (which is the default), only external method calls coming in through the proxy are intercepted. This means that self-invocation, in effect, a method within the target object calling another method of the target object, will not lead to an actual transaction at runtime even if the invoked method is marked with @Transactional.



    在您的示例中,对 handlingIncomingOrders() 的外部调用通过代理并命中目标对象( CustomerService 的一个实例)。但是,随后调用 saveOrderDetails()是目标对象内部的普通方法调用,因此永远不会调用代理中的事务行为。但是,如果 saveOrderDetails()从另一个类调用,您会发现事务行为将按预期工作。

    关于Spring事务不回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16167278/

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