【发布时间】:2014-12-26 12:17:33
【问题描述】:
我正在学习Spring Core认证,我对XML配置文件的声明式事务配置有以下疑问。
所以我知道我可以配置事务行为注释类和\或必须是事务行为的方法,如下所示:
@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
}
}
我也知道有时我不能使用注释来配置类和\或方法的事务行为(例如,如果我没有包含必须以事务方式工作的方法的类的 Java 代码)。
所以我可以使用 XML 配置 和 AOP 来配置事务行为。
阅读文档我知道我可以这样做:
AOP 切入点声明建议的内容。
Spring 的 tx 命名空间可以简洁地定义 交易建议。
可以将事务行为添加到任何用作 春豆
我有以下示例与如何操作有关:
<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 配置到底是做什么的。
我认为第一部分代表了我想要建议的声明:
<aop:config>
<aop:pointcut id=“rewardNetworkMethods” expression=“execution(* rewards.RewardNetwork.*(..))”/>
<aop:advisor pointcut-ref=“rewardNetworkMethods” advice-ref=“txAdvice”/>
</aop:config>
所以在这种情况下,我声明了一个与 rewards.RewardNetwork 中的所有方法相关的切入点,这些方法采用任何参数并返回任何类型的对象。
所以这意味着我想在所有这些方法中添加事务行为?还是什么?
这个标签的第二行到底是什么意思?,这个:
<aop:advisor pointcut-ref=“rewardNetworkMethods” advice-ref=“txAdvice”/>
然后,在第二部分中,在我看来,它指定了前一个切入点表达式选择的方法的子集,并且为这些方法启用了事务行为:
<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开头的方法
- 所有以 find 开头的方法
- 第三个 tx 标签选择了什么? (*)
在我看来,它首先使用 AOP 选择切入点来选择目标类和方法 我想在其上启用事务行为,然后使用 tx 标记来选择特定方法的子集以实现真正的事务性。
如果是这样,为什么存在选择方法并使其具有事务性的双重步骤?
是对的还是我错过了什么?你能具体解释一下这个配置的逻辑是什么吗?
【问题讨论】:
标签: java spring transactions spring-transactions