场景说明
在示例应用(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 类级 @Transactional 与 getOrCreateWorkflowRuntime 的 @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 通过
场景说明
在示例应用(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(HibernateTransactionRequiredException)根因:mock 模式下
MockInstanceFactory.create()通过new FlowService(...)创建服务,MockRepositoryHolder内部同样new WorkflowService(...),均为裸对象、无 Spring AOP 事务代理,导致FlowService类级@Transactional与getOrCreateWorkflowRuntime的@Transactional(REQUIRES_NEW)全部失效。提交时WorkflowService.getOrCreateWorkflowRuntime()调用真实 JPA 仓储WorkflowEntityRepository.lockById()(@Lock(PESSIMISTIC_WRITE)悲观锁),该查询要求必须在事务中执行,而无任何事务上下文,从而抛TransactionRequiredException。影响:mock 模式下无法创建/流转任何流程;生产模式因 Spring 事务代理正常不受影响。
期望实现
在
WorkflowEntityRepository.lockById()上补充@Transactional(默认 REQUIRED 传播):getOrCreateWorkflowRuntime的 REQUIRES_NEW 事务,仓储方法加入该事务,FOR UPDATE 锁依旧在快照创建提交后才释放,防并发重复快照语义不变;验证场景
MockFlowCreateReproduceTest:mock 模式 A(开始)-B(审批)-C(结束) 在 A 提交创建流程成功(修复前必现异常)FlowCreateReproduceTest:生产路径同样流程 A 提交创建成功(确认无回归)./mvnw clean install通过