Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server Spring@Transactional and PROPAGATION\u需要使用sql server 2012进行更新_Sql Server_Spring_Spring Transactions - Fatal编程技术网

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(),将 针对此引用而不是代理调用。这有 重要影响。这意味着自我调用不会发生 导致与方法调用关联的建议获得 执行的机会