spring的声名式事务,想必大家都很熟悉,之前我也自认为很熟悉。两天前帮同事调试了一段关于事务的代码,而事务采用的正是spring的声名式事务控制方式来管理。但是事务却不起作用,顿时蒙圈了,查了一下spring配置,其中aop:pointcut 中expression的值与execution(* a.b.**.service.support.*.*(..))类似,最后将表达式改为
execution(* a.b..service.support.*.*(..)),事务起作用了。从这个可以知道之前的配置不对。
为了更好的搞清楚experession表达式,所以特意组织的测试代码,测试了一下:
package a.b.c.d.e.service;
public interface HelloService {
public void updateId(String bizTag) throws Exception;
}
package a.b.c.d.e.service.support;
import org.springframework.stereotype.Service;
import a.b.c.d.e.service.HelloService;
@Service
public class HelloServiceImpl implements HelloService {
//代码略
}
事务配置切面
<aop:config>
<aop:pointcut id="allServiceMethods"
expression="execution(* a.b.c.d.**.service.support.*.*(..))" />
<aop:advisor advice-ref="defaultTransactionAdvice"
pointcut-ref="allServiceMethods" />
</aop:config>
<tx:advice id="defaultTransactionAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="update*" propagation="REQUIRED" rollback-for="Exception"/>
</tx:attributes>
</tx:advice>
下面对应expression不同的值,打印的相应的log,只截取了开启事务的那一部分:
1.execution(* a.b.c.d.e.service.support.*.*(..))
2017-06-16 23:15:35,945 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Creating new transaction with name [a.b.c.d.e.service.support.HelloServiceImpl.updateId]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,-Exception
2017-06-16 23:15:35,946 [main] DEBUG org.springframework.jdbc.datasource.DriverManagerDataSource - Creating new JDBC DriverManager Connection to [jdbc:mysql://localhost:3306/test]
2017-06-16 23:15:36,453 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Acquired Connection [com.mysql.jdbc.JDBC4Connection@1614c61] for JDBC transaction
2017-06-16 23:15:36,461 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Switching JDBC Connection [com.mysql.jdbc.JDBC4Connection@1614c61] to manual commit
2.execution(* a.b.c.d..service.support.*.*(..))
2017-06-16 23:18:55,452 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Creating new transaction with name [a.b.c.d.e.service.support.HelloServiceImpl.updateId]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,-Exception
2017-06-16 23:18:55,452 [main] DEBUG org.springframework.jdbc.datasource.DriverManagerDataSource - Creating new JDBC DriverManager Connection to [jdbc:mysql://localhost:3306/test]
2017-06-16 23:18:55,867 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Acquired Connection [com.mysql.jdbc.JDBC4Connection@1614c61] for JDBC transaction
2017-06-16 23:18:55,874 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Switching JDBC Connection [com.mysql.jdbc.JDBC4Connection@1614c61] to manual commit
3.execution(* a.b.c..service.support.*.*(..))
2017-06-16 23:19:56,600 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Creating new transaction with name [a.b.c.d.e.service.support.HelloServiceImpl.updateId]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,-Exception
2017-06-16 23:19:56,600 [main] DEBUG org.springframework.jdbc.datasource.DriverManagerDataSource - Creating new JDBC DriverManager Connection to [jdbc:mysql://localhost:3306/test]
2017-06-16 23:19:57,069 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Acquired Connection [com.mysql.jdbc.JDBC4Connection@1614c61] for JDBC transaction
2017-06-16 23:19:57,077 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Switching JDBC Connection [com.mysql.jdbc.JDBC4Connection@1614c61] to manual commit
4.execution(* a.b..service.support.*.*(..))
2017-06-16 23:21:55,226 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Creating new transaction with name [a.b.c.d.e.service.support.HelloServiceImpl.updateId]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,-Exception
2017-06-16 23:21:55,227 [main] DEBUG org.springframework.jdbc.datasource.DriverManagerDataSource - Creating new JDBC DriverManager Connection to [jdbc:mysql://localhost:3306/test]
2017-06-16 23:21:55,667 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Acquired Connection [com.mysql.jdbc.JDBC4Connection@195ac46] for JDBC transaction
2017-06-16 23:21:55,674 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Switching JDBC Connection [com.mysql.jdbc.JDBC4Connection@195ac46] to manual commit
5.execution(* a..service.support.*.*(..))
2017-06-16 23:23:00,468 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Creating new transaction with name [a.b.c.d.e.service.support.HelloServiceImpl.updateId]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,-Exception
2017-06-16 23:23:00,468 [main] DEBUG org.springframework.jdbc.datasource.DriverManagerDataSource - Creating new JDBC DriverManager Connection to [jdbc:mysql://localhost:3306/test]
2017-06-16 23:23:00,899 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Acquired Connection [com.mysql.jdbc.JDBC4Connection@1614c61] for JDBC transaction
2017-06-16 23:23:00,906 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Switching JDBC Connection [com.mysql.jdbc.JDBC4Connection@1614c61] to manual commit
6.execution(* a.**.service.support.*.*(..))没有开启事务
7.execution(* a.b.**.service.support.*.*(..)) 没有开启事务
8.execution(* a.b.c.**.service.support.*.*(..)) 没有开启事务
9.execution(* a.b.c.d.**.service.support.*.*(..))
我也以为spring不会开启事务,但是代码就是这样的有趣,日志如下:
2017-06-16 23:27:30,101 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Creating new transaction with name [a.b.c.d.e.service.support.HelloServiceImpl.updateId]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,-Exception
2017-06-16 23:27:30,101 [main] DEBUG org.springframework.jdbc.datasource.DriverManagerDataSource - Creating new JDBC DriverManager Connection to [jdbc:mysql://localhost:3306/test]
2017-06-16 23:27:30,573 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Acquired Connection [com.mysql.jdbc.JDBC4Connection@e61d6c] for JDBC transaction
2017-06-16 23:27:30,581 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Switching JDBC Connection [com.mysql.jdbc.JDBC4Connection@e61d6c] to manual commit