也许您忘记将事务注释添加到
AbstractmyprojectService.saveUsers()
请注意,内部调用永远不会被代理,因此流程如下:
TeacherimportServiceTest.testSaveTeachers() -> AbstractmyprojectService.saveUsers() -> TeacherimportServiceImpl.saveUserObject()
如果
AbstractmyprojectService.saveUsers()根本不交易,则不会交易。
编辑
阅读您的评论后,我看到了三种解决方法:
- 将
saveUsers()
方法提取到帮助程序类。
真的很简单,重构代码以将Tx方法保留在一个类中,并通过组合从另一个类使用它。
- 在中使用程序化交易
saveUserObject()
。
例如,注入txManager和
public void saveUserObject() { DefaultTransactionDefinition def = new DefaultTransactionDefinition(); def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); TransactionStatus status = txManager.getTransaction(def); try { // the pre } catch (Exception ex) { txManager.rollback(status); throw ex; } txManager.commit(status); }- 使用AspectJ代替Spring AOP。 (我认为此选项仅对于此问题而言过于复杂。)
使用AspectJ可以替换Aspect的AOP代理
AnnotationTransactionAspect
使用
<tx:annotation-driven mode="aspectj"/>并选择一种编织方法(编译或加载时间)。
有关加载时间编织的信息,请参见http://static.springsource.org/spring/docs/3.0.5.RELEASE/reference/aop.html#aop-
aj-
ltw



