Sql server Spring@Transactional and PROPAGATION\u需要使用sql server 2012进行更新
我有一个服务,它有几个标记为Sql server Spring@Transactional and PROPAGATION\u需要使用sql server 2012进行更新,sql-server,spring,spring-transactions,Sql Server,Spring,Spring Transactions,我有一个服务,它有几个标记为@Transactional的方法,包括方法a、b和c。这三个方法按以下方式嵌套:a->b->c。下面是一个代码示例: @Transactional public void a() { while(condition) { try { b(); } catch(MyException e) { logger.warn(e.getMessage()); } }
@Transactional
的方法,包括方法a、b和c。这三个方法按以下方式嵌套:a->b->c。下面是一个代码示例:
@Transactional
public void a() {
while(condition) {
try {
b();
} catch(MyException e) {
logger.warn(e.getMessage());
}
}
}
但是,方法b的注释如下:
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = {MyException.class})
<tx:annotation-driven />
<bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager">
<qualifier value="txm1"/>
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory">
<property name="dataSource" ref="dataSource"/>
<property name="persistenceXmlLocation" value="classpath:META-INF/jpa-persistence.xml"/>
<property name="persistenceUnitName" value="Unit1" />
</bean>
但是,当从方法c抛出MyException
时,异常会在方法a处被捕获,当方法a退出时,事务会被提交,其中包括调用抛出异常并应回滚的b()所做的一切(?)。
我在spring 3.0.7中使用sql server 2012 express,我的spring配置如下:
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = {MyException.class})
<tx:annotation-driven />
<bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager">
<qualifier value="txm1"/>
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory">
<property name="dataSource" ref="dataSource"/>
<property name="persistenceXmlLocation" value="classpath:META-INF/jpa-persistence.xml"/>
<property name="persistenceUnitName" value="Unit1" />
</bean>
方法
b
似乎与方法a
属于同一类。如果您没有使用AspectJ,@Transactional
-注释由JDK动态代理处理,通过该代理,您从类外的调用将传递到方法a
。调用需要通过代理才能使@Transactional
-注释生效,请参见此处“理解AOP代理”下的示例:
这里要理解的关键是
main类的main(..)具有对代理的引用。这意味着
对该对象引用的方法调用将是对代理的调用,
因此,代理将能够委托给所有
与特定方法相关的拦截器(通知)
呼叫但是,一旦调用最终到达目标对象,
SimplePojo引用在本例中,任何方法调用
make本身,例如这个.bar()或这个.foo(),将
针对此引用而不是代理调用。这有
重要影响。这意味着自我调用不会发生
导致与方法调用关联的建议获得
执行的机会