为什么“@Transactional(propagation = propagation.NEVER)”不起作用?
Why does not "@Transactional(propagation = propagation.NEVER)" work?
在 Spring 文档中,对于 NEVER
传播:
Execute non-transactionally, throw an exception if a transaction
exists.
我想尝试如下:
@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)
并在任何 transactional 方法中使用此方法,但它不起作用。我的意思是它必须抛出异常,但它没有。
我的 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>
感谢您的回答。
@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 代理调用而是直接调用,因此它的事务配置将被忽略。
Spring 交易是基于代理的。如果 bean A 调用另一个 bean B,就会抛出该异常,因为事务方面会拦截调用并抛出异常。但是在这里,您在同一个对象中调用另一个方法,因此事务代理不在画面中。
在 Spring 文档中,对于 NEVER
传播:
Execute non-transactionally, throw an exception if a transaction exists.
我想尝试如下:
@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)
并在任何 transactional 方法中使用此方法,但它不起作用。我的意思是它必须抛出异常,但它没有。
我的 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>
感谢您的回答。
@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 代理调用而是直接调用,因此它的事务配置将被忽略。
Spring 交易是基于代理的。如果 bean A 调用另一个 bean B,就会抛出该异常,因为事务方面会拦截调用并抛出异常。但是在这里,您在同一个对象中调用另一个方法,因此事务代理不在画面中。