Activiti:查询表 _TASK、_EXECUTION 和 _PROCDEF 时发生死锁

Activiti: deadlocks occuring with queries on tables _TASK, _EXECUTION and _PROCDEF

我们在 Activiti 对下表提供的一些标准 'Select' 查询中遇到了死锁: ACT_RU_TASKACT_RU_EXECUTIONACT_RE_PROCDEF。 这是一个示例查询:

### SQL: SELECT SUB.* FROM (     select distinct TEMPRES_ID_ as ID_, TEMPP_KEY_ as ProcessDefinitionKey, TEMPP_ID_ as ProcessDefinitionId,     TEMPRES_REV_ as REV_, TEMPRES_ACT_ID_ as ACT_ID_,     TEMPRES_BUSINESS_KEY_ as BUSINESS_KEY_, TEMPRES_IS_ACTIVE_ as IS_ACTIVE_,     TEMPRES_IS_CONCURRENT_ as IS_CONCURRENT_, TEMPRES_IS_SCOPE_ as IS_SCOPE_,     TEMPRES_IS_EVENT_SCOPE_ as IS_EVENT_SCOPE_, TEMPRES_PARENT_ID_ as PARENT_ID_,      TEMPRES_PROC_INST_ID_ as PROC_INST_ID_, TEMPRES_SUPER_EXEC_ as SUPER_EXEC_,      TEMPRES_SUSPENSION_STATE_ as SUSPENSION_STATE_, TEMPRES_CACHED_ENT_STATE_ as CACHED_ENT_STATE_,     TEMPVAR_ID_ as VAR_ID_, TEMPVAR_NAME_ as VAR_NAME_, TEMPVAR_TYPE_ as VAR_TYPE_, TEMPVAR_REV_ as VAR_REV_,     TEMPVAR_PROC_INST_ID_ as VAR_PROC_INST_ID_, TEMPVAR_EXECUTION_ID_ as VAR_EXECUTION_ID_, TEMPVAR_TASK_ID_ as VAR_TASK_ID_,     TEMPVAR_BYTEARRAY_ID_ as VAR_BYTEARRAY_ID_, TEMPVAR_DOUBLE_ as VAR_DOUBLE_,      TEMPVAR_TEXT_ as VAR_TEXT_, TEMPVAR_TEXT2_ as VAR_TEXT2_, TEMPVAR_LONG_ as VAR_LONG_     , row_number() over (ORDER BY TEMPRES_ID_ asc) rnk FROM ( select distinct      RES.ID_ as TEMPRES_ID_, RES.REV_ as TEMPRES_REV_, P.KEY_ as TEMPP_KEY_, P.ID_ as TEMPP_ID_,     RES.ACT_ID_ as TEMPRES_ACT_ID_, RES.PROC_INST_ID_ as TEMPRES_PROC_INST_ID_,      RES.BUSINESS_KEY_ as TEMPRES_BUSINESS_KEY_, RES.IS_ACTIVE_ as TEMPRES_IS_ACTIVE_,     RES.IS_CONCURRENT_ as TEMPRES_IS_CONCURRENT_, RES.IS_SCOPE_ as TEMPRES_IS_SCOPE_,     RES.IS_EVENT_SCOPE_ as TEMPRES_IS_EVENT_SCOPE_, RES.PARENT_ID_ as TEMPRES_PARENT_ID_,     RES.SUPER_EXEC_ as TEMPRES_SUPER_EXEC_, RES.SUSPENSION_STATE_ as TEMPRES_SUSPENSION_STATE_,     RES.CACHED_ENT_STATE_ as TEMPRES_CACHED_ENT_STATE_,     VAR.ID_ as TEMPVAR_ID_, VAR.NAME_ as TEMPVAR_NAME_, VAR.TYPE_ as TEMPVAR_TYPE_, VAR.REV_ as TEMPVAR_REV_,     VAR.PROC_INST_ID_ as TEMPVAR_PROC_INST_ID_, VAR.EXECUTION_ID_ as TEMPVAR_EXECUTION_ID_, VAR.TASK_ID_ as TEMPVAR_TASK_ID_,     VAR.BYTEARRAY_ID_ as TEMPVAR_BYTEARRAY_ID_, VAR.DOUBLE_ as TEMPVAR_DOUBLE_,      VAR.TEXT_ as TEMPVAR_TEXT_, VAR.TEXT2_ as TEMPVAR_TEXT2_, VAR.LONG_ as TEMPVAR_LONG_             from ACT_RU_EXECUTION RES     inner join ACT_RE_PROCDEF P on RES.PROC_DEF_ID_ = P.ID_             left outer join ACT_RU_VARIABLE VAR ON RES.PROC_INST_ID_ = VAR.EXECUTION_ID_ and VAR.TASK_ID_ is null  WHERE RES.PARENT_ID_ is null and P.KEY_ = ?  and RES.BUSINESS_KEY_ = ?   )RES ) SUB WHERE SUB.rnk >= ? AND SUB.rnk < ?

Activiti 版本为5.15.1,但请注意,由于项目时间紧迫,我们无法升级它。

有没有人经历过类似的事情,或者有没有人开始理解为什么会发生这种情况以及如何预防?

当您说 "deadlocks" 时,您指的是乐观锁定异常还是实际死锁? 如果实际死锁,您是否使用 MSSql 服务器数据库? 我问是因为乐观锁定异常的原因相对众所周知,并且几乎总是可以通过良好的流程建模来解决。

如果是 MSSql 死锁,那么它可能与 Camunda(Activiti 分支)下报告的问题相同:

https://app.camunda.com/jira/si/jira.issueviews:issue-html/CAM-1646/CAM-1646.html

如果是这个问题,在Camunda Jira问题中有解决说明。

干杯, 格雷格