代码之家  ›  专栏  ›  技术社区  ›  Bozho

基于注释和基于XML的事务定义优先级

  •  5
  • Bozho  · 技术社区  · 15 年前

    我在文件中找不到一个明确的答案,虽然似乎有一个合乎逻辑的答案,但人们不能确定。场景是这样的-您有一个基于XML的事务定义,比如:

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

    建议所有的服务方法。但是你有 @Transactional 在要重写 propagation 属性。

    很明显 交易的 在方法级别重写同一个在类级别,但它是否重写 <tx:advice> (实际上, <aop:pointcut> )?

    我希望不会在同一个类上创建两个拦截器,(无论哪个拦截器是第一个,都将启动事务)

    2 回复  |  直到 14 年前
        1
  •  4
  •   Bozho    15 年前

    感谢斯卡夫曼的努力。最后我想我的行为是:

    1. 两个 <aop:advisor> @Transactional (一起) <tx:annotation-driven> 创建一个 TransactionInterceptor 围绕目标类(其方法将在事务中运行的类)。
    2. 建议用较低的 order 属性覆盖另一个属性。如果未指定order属性,则未定义该顺序。但我的测试显示 applicationContext.xml 优先考虑,尽管情况并非总是这样:

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

    至少这是弹簧2.5.6的特性。

        2
  •  3
  •   skaffman    15 年前

    经过一番挖掘,我想答案就在 TxAdviceBeanDefinitionParser.doParse . 逻辑上说:

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

    唯一能读到的 @Transactional AnnotationTransactionAttributeSource 对我来说,这强烈地暗示了 <tx:advice> 将咨询 交易的 当且仅当 <tx:attributes> 未指定,因此不可能进行重写。

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

    尽管如此,我仍然认为值得尝试一下看看它的作用,因为它可能通过其他机制起作用。