图片含特殊代码,做了保护做了删除.
控制层进来参数,调用factory
首先调用下面的代码:
之后根据不同的flowType获取不同实现执行saveOrSubmit方法
类似的两个方法有如下两个:
都是类似的,只不过有的返回的参数不同,所以整个返回值为Object.
再查看giRecoveryService中的方法:
这里加了@Transactional,为了保证else if下的SUBMIT提交方法.
之后就是有疑问的地方,
这里的:
this.checkFileComplete(entity.getInstanceId(),nodeCode);
在有的service中是没有写的.所以好像没有必要加@Transactional的意义.
再查看INode.commonSubmitByNode方法
这是一个接口中的静态方法,是没法加@Transactional的.
这个反射调用调用了指定的方法,但方法都是submit(除了内里的有些前置执行不同,最终都要执行了save方法).
虽然这个方法执行的查询与更新,但是没有加@Transactional,
这里是考虑到了@Transactional的传递性.(也就是图4上的@Transactional)
但是我这里不太确定,在最终执行到图6时,经过了接口的静态方法调用,
是否还有事务执行到图6代码之上呢?
“是否还有事务执行到图6代码之上呢?”,有的,不过你这个描述不太严谨,没有“事务执行到”这种东西。
不用过于强调事务,比如 a->b->c->d->e
,只要 a 开启了事务(获取连接+绑定+beginTx),那么bcde就算不加@Transactional
默认也是使用 a 的连接,那么 abcde 就在是个事务,一旦回滚就全部回滚的
对于嵌套事务来说(默认级别),子事务加不加注解没啥区别,都是使用当前事务资源(包括连接)。
事物传播行为介绍:
@Transactional(propagation=Propagation.REQUIRED) :如果有事务, 那么加入事务, 没有的话新建一个(默认情况下)
@Transactional(propagation=Propagation.NOT_SUPPORTED) :容器不为这个方法开启事务
@Transactional(propagation=Propagation.REQUIRES_NEW) :不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务
@Transactional(propagation=Propagation.MANDATORY) :必须在一个已有的事务中执行,否则抛出异常
@Transactional(propagation=Propagation.NEVER) :必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY相反)
@Transactional(propagation=Propagation.SUPPORTS) :如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务.