为什么“@Transactional(propagation = propagation.NEVER)”不起作用?

时间:2015-04-24 21:02:45

标签: java spring transactions spring-aop spring-annotations

关于春季文档,从不传播: 如果事务存在,则以非事务方式执行,抛出异常。

我想尝试以下内容:

    @Transactional(propagation = Propagation.NEVER)
    public void getDeps(long ID) {
        System.out.println(databaseImp.getDepartmentByID(ID));
    }

    @Transactional(propagation = Propagation.REQUIRED)
    public void allProcessOnDB_second(long ID) {
        getDeps(ID);
        operation(ID);
    }
   @Transactional
   public void operation(long id){
        System.out.println(databaseImp.getDepartmentByID(id));
    }
嗯,代码想做什么并不重要 我使用@Transactional(propagation = Propagation.NEVER),我在任何事务方法中使用此方法,但我工作,我的意思是它必须抛出异常。我的spring元配置文件(xml)如下:

<context:annotation-config></context:annotation-config>
    <context:component-scan base-package="database.transactionmanagement"/>

<tx:annotation-driven transaction-manager="transactionManager" mode="aspectj"/>

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <constructor-arg name="dataSource" ref="datasource2"/>
    </bean>

 <bean id="datasource2" class="org.apache.tomcat.dbcp.dbcp2.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost/hr"/>
        <property name="username" value="root"/>
        <property name="password" value=""/>
    </bean>

感谢您的回答。

2 个答案:

答案 0 :(得分:2)

@Transactional注释仅适用于Spring代理对象。例如,如果你从一个注入你的服务的spring bean中调用allProcessOnDB_second()

@Autowired 
private MyService myService; 
...
myService.allProcessOnDB_second();

然后myService是Spring代理,并且应用了@Transactional(propagation = Propagation.REQUIRED)。如果您致电myService.getDeps(id),则会应用@Transactional(propagation = Propagation.NEVER)

但是当你调用第一个方法,然后调用第二个方法时,第二个方法不是通过Spring代理调用而是直接调用,所以忽略了它的事务配置。

答案 1 :(得分:2)

Spring事务是基于代理的。如果bean A调用另一个bean B,则抛出该异常,因为事务方面将拦截调用并抛出异常。但是在这里,你在同一个对象中调用另一个方法,因此事务代理就不在了。