原来有一个我忽略了的“ gatcha” …
从Spring文档
在代理模式(默认)下,将仅拦截通过代理传入的“外部”方法调用。这意味着即使调用的方法标记有@Transactional,“自调用”(即目标对象中的一种方法调用目标对象的其他方法)也不会在运行时导致实际事务!
因为我一直在内部进行递归,所以未应用事务划分。
解决方案是通过代理递归,像这样…
@Autowiredprivate ApplicationContext applicationContext;@Transactional(propagation = Propagation.REQUIRES_NEW)public void doSomeWork(){ Entity = entity = dao.loadEntity(); // do some related work ... try { dao.saveEntity(entity); } catch(StaleObjectStateException sose){ dao.flush(entity); applicationContext.getBean(this.getClass()).doSomeWork(); }}


