【问题标题】:How to exclude method from the transaction advice?如何从交易通知中排除方法?
【发布时间】:2011-05-20 23:56:02
【问题描述】:

我有以下声明:

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

我包装了切入点模式中的所有方法的事务。 但我想要自定义包装方法之一。 tx:advice 是否具有 Spring.Net 的“黑名单”功能?

【问题讨论】:

    标签: c# nhibernate transactions aop spring.net


    【解决方案1】:

    我认为&lt;tx:advice ... /&gt; 标签中没有“黑名单”功能。交易通知将始终应用于匹配方法。

    我认为&lt;tx:attributes ... /&gt; 列表的目的是指定要使用哪些事务属性(取决于方法的名称),而不是将方法排除在事务中。

    如果您只对将自定义事务属性 应用于特定方法感兴趣,则可以轻松完成。例如,如果您想为VerySpecificMethod 设置read-only=true 而不是默认值false

    <tx:advice id="txAdvice" transaction-manager="transactionManager">
      <tx:attributes>
        <tx:method name="VerySpecificMethod" read-only="true"/>
        <tx:method name="*"/>
      </tx:attributes>
    </tx:advice>
    

    第一个匹配的方法名称将指定要使用的事务属性,所以现在,VerySpecificMethod 将在只读事务中执行。其他方法将使用默认值false

    【讨论】:

    • 谢谢,放假后试试。
    • 我想从一种方法中调用方法 Save 和 Get,但是这些方法是通过 AOP 由一个事务包装的。由于没有事务提交,Get 调用会抛出异常。
    • 那么你应该使用传播属性。像&lt;tx:method name="VerySpecificMethod" propagation="RequiresNew"/&gt; 这样的东西。检查the docs for the available propagation attributes
    • 默认使用同一个事务。保存的时候当然不应该使用read-only="true"属性设置。
    • 你能试试&lt;tx:method name="NameOfWrappingMethod" propagation="Never"/&gt;吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 2014-02-10
    • 2021-12-22
    • 2021-12-09
    • 2019-06-14
    相关资源
    最近更新 更多