在spring文档中,对于永不传播的内容:
非事务执行,如果存在事务,则引发异常。

我想尝试以下操作:

    @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 meta配置文件(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>


感谢您的回答。

最佳答案

@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代理而是直接调用第二个方法,因此将忽略其事务配置。

09-25 22:22