Skip to content

mock 模式下创建流程报 Query requires transaction be in progress #192

Description

@xlorne

场景说明

在示例应用(flow-engine-example)的模拟测试(mock 模式,POST /api/cmd/workflow/mock 生成 mockKey)下,创建 A(开始)-B(审批)-C(结束) 流程,点击 A 提交时出现异常。

发现的问题

1. mock 模式创建流程抛 TransactionRequiredException

异常:org.springframework.dao.InvalidDataAccessApiUsageException: Query requires transaction be in progress, but no transaction is known to be in progress(Hibernate TransactionRequiredException

根因:mock 模式下 MockInstanceFactory.create() 通过 new FlowService(...) 创建服务,MockRepositoryHolder 内部同样 new WorkflowService(...),均为裸对象、无 Spring AOP 事务代理,导致 FlowService 类级 @TransactionalgetOrCreateWorkflowRuntime@Transactional(REQUIRES_NEW) 全部失效。提交时 WorkflowService.getOrCreateWorkflowRuntime() 调用真实 JPA 仓储 WorkflowEntityRepository.lockById()@Lock(PESSIMISTIC_WRITE) 悲观锁),该查询要求必须在事务中执行,而无任何事务上下文,从而抛 TransactionRequiredException

影响:mock 模式下无法创建/流转任何流程;生产模式因 Spring 事务代理正常不受影响。

期望实现

WorkflowEntityRepository.lockById() 上补充 @Transactional(默认 REQUIRED 传播):

  • 生产环境:已存在 getOrCreateWorkflowRuntime 的 REQUIRES_NEW 事务,仓储方法加入该事务,FOR UPDATE 锁依旧在快照创建提交后才释放,防并发重复快照语义不变;
  • mock 环境:无外层事务,由仓储自身开启事务执行锁查询,不再报错。

验证场景

  • MockFlowCreateReproduceTest:mock 模式 A(开始)-B(审批)-C(结束) 在 A 提交创建流程成功(修复前必现异常)
  • FlowCreateReproduceTest:生产路径同样流程 A 提交创建成功(确认无回归)
  • 全量 ./mvnw clean install 通过

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions