【问题标题】:How to join parent transation in spring using @Transactional annotaion如何使用@Transactional注解在spring中加入父事务
【发布时间】:2017-02-21 04:46:27
【问题描述】:

我对春季交易非常陌生。由于我的组织使用的一些代码标准,我在调用任何方法时要求加入父交易(如果存在)。

我的应用程序是一个具有三层的 Spring MVC 应用程序

  1. Web 层(控制器类)
  2. 服务层(包含业务逻辑的服务类)
  3. DAO 层(用于 DB 相关查询的 DAO(数据访问层)类)

现在在服务层的一个方法中使用了三种不同的dao层方法。我使用@Transactional 将此服务方法注释为事务性质。现在我希望从此服务层方法调用的所有三个 dao 方法在本质上也是事务性的,并且必须加入由服务层方法启动的父事务,坚持为每个 dao 方法启动其他新翻译。

【问题讨论】:

  • 只有一个问题:你为什么要这么做?
  • 可以说我在 DAO 层上有三种方法可以对三个不同的表进行操作。首先我要插入一些东西,第二个我想更新新生成的表 id。第三,我还想根据第一个表的新插入数据来更新一些东西。现在正如我已经说过的,我没有在 dao 层上保留任何业务逻辑,所以我将业务逻辑保留在我决定插入或更新什么的服务层上。因此,如果在任何方法中插入或更新失败,我想回滚所有内容。这就是为什么我想这样做
  • 如果你只是注释你的服务方法,这个行为已经被覆盖了。

标签: java spring transactions jdbctemplate spring-transactions


【解决方案1】:

您可以将@Transactional 注释中的propagation 元素与属性Propagation.MANDATORY 一起使用。这样,该方法支持当前事务或如果没有活动事务则抛出异常。因此,在您的 DAO 层中,您可以执行以下操作:

@Transactional(propagation=Propagation.MANDATORY)
public void daoMethod() { // some logic }

【讨论】:

    【解决方案2】:

    您需要使用REQUIRES_NEW 传播来注释您的服务方法。这将标志着交易的开始。默认情况下,如果被此方法调用,dao 方法将继承事务行为并使用现有事务。

    但是,如果您想在代码中表示事务边界,可以使用REQUIRED(如果存在则参与事务,如果不存在则创建新的)或MANDATORY(参与事务)来注释它们如果存在,则抛出异常)。

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void serviceMethod() {}
    
    @Transactional(propagation = Propagation.REQUIRED)
    public void daoMethod1() {}
    
    @Transactional(propagation = Propagation.REQUIRED)
    public void daoMethod2() {}
    

    【讨论】:

      猜你喜欢
      • 2018-03-28
      • 1970-01-01
      • 2011-07-18
      • 2019-09-20
      • 1970-01-01
      • 2011-08-14
      • 2011-04-06
      • 2015-07-19
      • 2021-12-24
      相关资源
      最近更新 更多