我们有一个 Spring 交易回滚问题,回滚似乎不起作用。

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

一些点:

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

  • UPDATE :

    代码段...

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

    公共(public)类CustomerService {

    //@自动连线
    CustomerOrderDAO customerOrderDAOImpl;
    //@自动连线
    CustomerItemDAO customerItemDAOImpl;
    //@自动连线
    CustomerPromotionDAO customerPromotionDAOImpl;
    //@自动连线
    PromotionDAO PromotionDAOImpl;

    //其他变量

    public CustomerOrder handleIncomingOrders(CustomerOrder customerOrder){
    尝试 {
    saveOrderDetails(customerOrder);
    .....
    返回customerOrder;
    } catch(Exception e)//TO-DO捕获适当的异常
    {
    //发送错误响应
    .......
    返回customerOrder;
    }
    }

    @交易
    public void saveOrderDetails(CustomerOrder customerOrder)引发异常{
    customerOrderDAOImpl.create(customerOrder);
    ....
    同时(promotionsIterator.hasNext()){
    customerPromotion.setPromotionName(promotionDAOImpl.getName(customerOrder.getPromotionId));
    customerPromotionDAOImpl.create(customerPromotion);
    }
    ......
    同时(customerItemIterator.hasNext()){
    customerItemDAOImpl.create(customerItem);
    }

    }
    }

    任何想法?
    谢谢。

    最佳答案

    @Transactional的默认行为是在对象周围添加了代理交易行为(示例中的CustomerService)。从reference docs(向下滚动):



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

    10-04 20:09