看下面这个测试:
1.测试用到的类,AService其中有2个方法分别是f1(); f2(); AServiceImpl中对于两个方法的实现:
@Override public void f1() { Session session = getSession(); logger.debug(session.hashCode()); } @Override public void f2() { f1(); f1(); }
2.使用spring aop将事务配置在AService的任意方法上。
3.TestCase代码如下:
@Test public void testList() throws ParseException, InterruptedException { log.debug("invoke f1 2 times"); aService.f1(); aService.f1(); log.debug("invoke f2 "); aService.f2(); }
运行结果如下:
2013-07-25 16:31:26,359 [DEBUG] ****testList(DataSourceTestCase.java:18) - invoke f1 2 times
2013-07-25 16:31:26,375 [DEBUG] ****.f1(FundProfileServiceImpl.java:25) - 15095802
2013-07-25 16:31:26,390 [DEBUG] ****.f1(FundProfileServiceImpl.java:25) - 27653884
2013-07-25 16:31:26,390 [DEBUG] ****.testList(DataSourceTestCase.java:22) - invoke findForTest2
2013-07-25 16:31:26,390 [DEBUG] ****.f1(FundProfileServiceImpl.java:25) - 19997070
2013-07-25 16:31:26,406 [DEBUG] ****.f1(FundProfileServiceImpl.java:25) - 19997070
可见在testList方法中调用的两次f1,对应的session不是同一个实例。
f2调用的两次f1中对应的session是同一实例。
原因应该是这样:
在testList方法中调用的两次f1,是两个不同的事务。f2调用的两次f1是在同一事务中。
对吧?应该不确切。