【问题标题】:spring transaction how to be created in service method that contain 3 dao method invokespring 事务如何在包含 3 个 dao 方法调用的服务方法中创建
【发布时间】:2014-11-14 04:15:08
【问题描述】:

我有一个 database.xml 来定义 spring 事务,比如

<aop:config proxy-target-class="true">
        <aop:advisor advice-ref="txAdvice"
            pointcut="execution(* com.compass.utils..*.*(..))" />
</aop:config>

和我的dao,service都在utils包或者子包里 喜欢:

com.compass.utils.db.dao
com.compass.utils.service

如果我的服务类是这样的

    public class AlarmService {
         @autowired
         private AlarmDao alarmDao;
         @autowired
         private PositionDao positionDao;
         @autowired
         private AccountDao accountDao;
      public void testService(){
          alarmDao.save(a);
          positionDao.save(b);
          accountDao.save(c);
     }
   }

在调用 testService 时创建了多少事务? 4 个事务?三个事务用于保存调用,一个事务用于 testService?还是只有一个事务?

如果创建了4个事务,如果保存或testService抛出异常,如何回滚? 可能是positionDao.save(b)抛出异常,只是positionDao.save回滚的事务,alarmDao保存完成还是因为testService事务全部保存回滚?

如果我更改 AlarmService 包路径,请使用 com.compass.utils,例如 com.compass.service,对我的问题的交易有什么影响?

当AlarmService在com.compass.service包中,并且我在testService方法中注解@Transactional,对我的问题的事务有什么影响?

@Transactional 可以@Override database.xml 配置吗?

提前感谢您的帮助和建议!

【问题讨论】:

    标签: java spring hibernate transactions


    【解决方案1】:

    在调用 testService 时创建了多少事务? 4 笔交易?3 笔交易

    将仅创建一个 TX,如果其中一种保存方法发生异常,则该 TX 将回滚。

    如果我更改 AlarmService 包路径,使其脱离 com.compass.utils,如 com.compass.service,对我的问题的交易有何影响?

    将创建 3 个 TX,每个 TX 将单独提交或回滚。

    当AlarmService在com.compass.service包中,并且我在testService方法中注解@Transactional,对我的问题的事务有什么影响?

    无,因为它不在配置的包中,Spring 不建议这样做,因此您的注释将被忽略。这将像第二个问题一样,将创建 3 个事务。

    @Transactional 可以@Override database.xml 配置吗?

    是的,Spring 能够同时使用 XML 和注解配置,并且始终使用最具体的配置,在这种情况下是注解。

    附:您可以使用不同的propagation 级别更改所有这些。这些都是基于默认行为。

    【讨论】:

    • 非常感谢,您的第一个问题的答案只会创建一个 TX,来自文档?还是其他参考?
    • 这就是REQUIRED 传播的工作方式,这是默认设置。 docs.spring.io/spring/docs/current/javadoc-api/org/…
    • 是的,但是在第一个alarmDao.save(a)之后;为什么事务没有关闭?如果它关闭了,没有事务存在,为什么不创建一个新的?因为testService方法?
    • 当管理器看到一个带有REQUIRED属性的方法时,如果上下文中有一个TX在运行,它使用相同的TX,否则创建一个新的TX并将其与该方法关联。在您的示例中,testService 是入口点,因此经理为其创建了一个 TX;稍后在调用alarmDao.save 时,由于存在 TX,经理使用现有的而不创建另一个。当创建者方法(在这种情况下为testService)完成时,管理器也足够聪明,可以在其他 dao 方法完成时关闭 TX。
    猜你喜欢
    • 2017-06-18
    • 2013-09-09
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 2011-11-06
    • 2015-09-01
    • 1970-01-01
    相关资源
    最近更新 更多