这样的事务@Transactional会不会有问题呢?

ukzq
  • 44

图片含特殊代码,做了保护做了删除.

控制层进来参数,调用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代码之上呢?

回复
阅读 430
2 个回答
✓ 已被采纳

“是否还有事务执行到图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没有声明事务,那就不用事务.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏