我的猜测是它
ServiceUser.method()本身是事务性的。不应该这样 这就是原因。
调用
ServiceUser.method()方法时,会发生以下情况:
- 事务性拦截器拦截方法调用,并启动一个事务,因为没有事务已处于活动状态
- 该方法称为
- 该方法调用MyService.doSth()
- 事务拦截器拦截方法调用,发现事务已处于活动状态,并且不执行任何操作
- doSth()被执行并引发异常
- 事务拦截器拦截异常,将事务标记为rollbackOnly,并传播异常
- ServiceUser.method()捕获异常并返回
- 事务拦截器由于已经启动了事务,因此尝试提交它。但是Hibernate拒绝这样做,因为该事务被标记为rollbackOnly,因此Hibernate引发异常。事务拦截器通过引发包装hibernate异常的异常来将信号通知给调用方。
现在,如果
ServiceUser.method()不是事务性的,将发生以下情况:
- 该方法称为
- 该方法调用MyService.doSth()
- 事务拦截器拦截方法调用,发现没有事务已经处于活动状态,因此启动了一个事务
- doSth()被执行并引发异常
- 事务拦截器拦截异常。由于已启动事务,并且已引发异常,因此它将回滚事务并传播异常
- ServiceUser.method()捕获异常并返回



