首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Spring配置启用事务性行为?

如何使用Spring配置启用事务性行为?
EN

Stack Overflow用户
提问于 2014-12-26 12:17:33
回答 1查看 2.6K关注 0票数 0

我正在学习Spring认证,我对通过XML配置文件进行的声明式transacion配置有以下疑问。

因此,我知道我可以配置必须是事务性行为的事务性行为注释类和\or方法,如下所示:

代码语言:javascript
复制
@Transactional(timeout=60)
public class RewardNetworkImpl implements RewardNetwork {

    public RewardConfirmation rewardAccountFor(Dining d) {
        // atomic unit-of-work
    }

    @Transactional(timeout=45)
    public RewardConfirmation updateConfirmation(RewardConfirmantion rc) {
        // atomic unit-of-work
    }
}

我还知道,有时我不能使用注释来配置类和\or方法的事务行为(例如,如果我没有包含必须以事务性方式工作的方法的类的Java代码)。

因此,我可以使用XML配置AOP配置事务行为。

阅读我知道我可以这样做的文档:

  1. AOP切入点声明了该建议什么。
  2. Spring的tx命名空间支持事务通知的简明定义。
  3. 可以将事务行为添加到用作Spring的任何类中

下面的例子说明了如何做到这一点:

代码语言:javascript
复制
<aop:config>
    <aop:pointcut id=“rewardNetworkMethods” expression=“execution(* rewards.RewardNetwork.*(..))”/>
    <aop:advisor pointcut-ref=“rewardNetworkMethods” advice-ref=“txAdvice”/>
</aop:config>

<tx:advice id=“txAdvice”>
    <tx:attributes>
        <tx:method name="get*" read-only="true" timeout="10"/>
        <tx:method name="find*" read-only="true" timeout="10"/>
        <tx:method name="*" timeout="30"/>
    </tx:attributes>
</tx:advice>

<bean id=“transactionManager”
class=“org.springframework.jdbc.datasource.DataSourceTransactionManager”>
    <property name=“dataSource” ref=“dataSource”/>
</bean>

好的,但是现在我有一些问题要理解前面的XML配置到底是怎么做的。

我认为第一节代表了我想建议的声明,

代码语言:javascript
复制
<aop:config>
    <aop:pointcut id=“rewardNetworkMethods” expression=“execution(* rewards.RewardNetwork.*(..))”/>
    <aop:advisor pointcut-ref=“rewardNetworkMethods” advice-ref=“txAdvice”/>
</aop:config>

因此,在本例中,我声明了一个与rewards.RewardNetwork中所有接受任何参数并返回任何类型对象的方法相关的切入点。

这意味着我想在所有这些方法中添加事务行为?不然呢?

这个标签的第二行到底是什么意思?,这一行:

代码语言:javascript
复制
<aop:advisor pointcut-ref=“rewardNetworkMethods” advice-ref=“txAdvice”/>

然后,在第二节中,在我看来,它指定了由前一个切入点表达式选择的metodse的子集,并且为这些方法启用了事务行为:

代码语言:javascript
复制
<tx:advice id=“txAdvice”>
    <tx:attributes>
        <tx:method name="get*" read-only="true" timeout="10"/>
        <tx:method name="find*" read-only="true" timeout="10"/>
        <tx:method name="*" timeout="30"/>
    </tx:attributes>
</tx:advice>

在这种情况下,我认为使用tx命名空间可以为以下方面提供事务通知的简明定义:

  • 所有以get开头的方法
  • 从发现开始的所有方法
  • 第三个tx标签的选择是什么?(*)

在我看来,它首先使用AOP来选择切入点来选择我想要在其上启用事务行为的目标类和方法,然后使用tx标记来选择一个特定方法的子集来进行现实事务处理。

如果是这样的话,为什么存在这个双重步骤来选择methos并使其具有事务性呢?

这是对的还是我遗漏了什么?你能确切地解释一下这种配置的逻辑吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-26 12:54:04

代码语言:javascript
复制
<aop:advisor pointcut-ref=“rewardNetworkMethods” advice-ref=“txAdvice”/>

这一行意味着对于定义的切入点

代码语言:javascript
复制
<aop:pointcut id=“rewardNetworkMethods” expression=“execution(* rewards.RewardNetwork.*(..))”/>

将执行名为txAdvise的建议。第二部分

代码语言:javascript
复制
<tx:advice id=“txAdvice”>
<tx:attributes>
    <tx:method name="get*" read-only="true" timeout="10"/>
    <tx:method name="find*" read-only="true" timeout="10"/>
    <tx:method name="*" timeout="30"/>
</tx:attributes>

是tAdvice通知的具体定义。首先,很明显,建议是事务性行为定义。txAdvice中的*表示get*与find*行不匹配的所有内容都得到*定义。

这种配置允许--但不是强制--允许某些复制,这是正确的。根据我的理解,这是因为AOP名称空间的第一部分是通用的spring,需要说明哪些Java功能需要aop编辑(默认情况下是代理)。第二部分将具体的AOP代理定义为tx代理,并允许对tx行为进行微调。您不能将其放入AOP部分,因为aop名称空间是通用的AOP,对事务一无所知。另一方面,在给定的建议下,对tx行为进行微调是非常有用的。通常,您会为一个包中的所有服务声明切入点,然后为给定的方法命名模式声明通用的tx建议(就像在您的示例中一样)。这样,基于注释的定义就不可能得到非常统一和通用的tx定义。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27657013

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档