【问题标题】:Annotation-based and xml-based transaction definitions precedence基于注释和基于 xml 的事务定义优先级
【发布时间】:2010-01-02 09:58:25
【问题描述】:

我在文档中找不到明确的答案,虽然似乎有一个合乎逻辑的答案,但无法确定。场景是这样的——你有一个基于 xml 的事务定义,比如:

<tx:advice id="txAdvice" transaction-manager="jpaTransactionManager">
    <tx:attributes>
        <tx:method name="*" propagation="REQUIRED" />
    </tx:attributes>
</tx:advice>

建议所有服务方法。但是你在一个具体的类/方法上有@Transactional,你想覆盖propagation属性。

很明显,方法级别的@Transactional 覆盖了类级别的同一个,但它是否覆盖了&lt;tx:advice&gt;(实际上是&lt;aop:pointcut&gt;)?

我希望不要在同一个类上创建两个拦截器,(并且无论哪个最先开始事务)

【问题讨论】:

    标签: java spring


    【解决方案1】:

    感谢 skaffman 的努力。最后我想我得到了这种行为:

    1. &lt;aop:advisor&gt; 和@Transactional(与&lt;tx:annotation-driven&gt; 一起)在目标类(其方法将在事务中运行)周围创建一个TransactionInterceptor。
    2. order 属性较低的建议会覆盖另一个。如果未指定 order 属性,则 order 未定义。但我的测试表明,applicationContext.xml 中最新定义的优先级优先,尽管情况并非总是如此:

    当定义在不同方面的两条通知都需要在同一个连接点运行时,除非您另外指定,否则执行顺序是不确定的。

    至少这是 spring 2.5.6 的行为。

    【讨论】:

      【解决方案2】:

      经过一番挖掘,我认为答案在于TxAdviceBeanDefinitionParser.doParse。逻辑说:

      if <tx:attributes> is present then
         parse <tx:attributes> 
      else
         instantiate an AnnotationTransactionAttributeSource to determine TX attributes
      

      鉴于读取@Transactional 的唯一内容是AnnotationTransactionAttributeSource,这强烈建议我当且仅当&lt;tx:attributes&gt; 未指定时&lt;tx:advice&gt; 将咨询@Transactional,因此不可能覆盖。

      这似乎与 Spring 通常的“最小意外原则”方法相矛盾,因为像您一样,我希望注释在每个类或每个方法的基础上优先。我会在他们的 JIRA 上提出问题以改变这种行为。

      说了这么多,我仍然认为值得尝试看看它的作用,因为它可能通过其他机制起作用。

      【讨论】:

      • 有趣的是,它的行为符合我们的预期。我现在也将进行一些挖掘,看看 TxAdviceBeanDefinitionParser 还有什么......
      • 我想知道TxAdviceBeanDefinitionParser生成的代理在调用时是否正在检查目标bean的注释。
      • 事实证明,我对正在创建的两个 TransactionInterceptor 的猜测是正确的。我在春季论坛上提出了这个问题(包括我的新发现),并将及时通知您。
      • 您的上下文中是否还有&lt;tx:annotation-driven&gt;?这将触发额外的代理创建。
      • 是的,有。否则根本不会考虑@Transactional。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-24
      • 2021-07-28
      • 2021-01-09
      • 1970-01-01
      相关资源
      最近更新 更多