Camunda:流程引擎内的事务

614 阅读2分钟

camunda流程引擎,在各等待节点之间支持事务回滚,也可以通过标记异步延续该表事务的范围;

但camunda不支持数据库相关的事务,如果在某个节点已经提交到数据库,需要手动处理或利用其它机制进行数据回退,类似分布式事务的处理。

camunda事务描述

camunda事务与关系型数据库中的事务有点区别,但是通过关系型数据库事务实现的,camunda中的一个事务是两个wait state之间的部分。

camunda流程引擎是被动触发的,如启动流程实例、complete一次task、发送一次执行信号、引擎内部的job executor触发等,一次失误没结束时,数据没有被持久化到DB,相关数据表会加乐观锁。此时如果在事务中断点停止,其他访问(如访问cockpit)会被挂起。

一个事务间的所有活动要么同时成功,要么同时失败。

等待状态(wait states) wait state是camunda事务的边界。位于等待状态的任务时,状态已经提交到数据库。

以下元素,通常是处于wait state状态。 image.png 事务边界 sp20231212_092054_150.png 上图用户任务,定时事件都是wait state元素,中间形成第一个事务,如果业务任务(validate address)失败,会回滚到上次wait state元素处,也就是人工任务(Provide shipping address);

异步连续(Asynchronous Continuations)

sp20231212_094507_758.png 图上生成发票和发送发票给顾客是第二个事务,采用了异步延续,如果失败,并不会让流程回滚。 异步延续会创建事务边界。

如果是下图这种非异步延续的,在抛出异常时会回滚到用户任务处。抛异常的任务状态不会提交到引擎数据库中。

乐观锁及乐观锁异常

camunda采用乐观锁来控制并发案例,涉及到并发控制的表中都会有字段REV_版本号,每次修改都会更新版本号,查询数据时会查询指定版本的数据。乐观锁机制大大提高了camunda在高并发场景的性能。

job executor发起的执行引擎OptimisticLockingException乐观锁异常时,会自动重试。

其他外部调用引起的OptimisticLockingException需要根据业务要求进行处理,引擎数据会回滚到上个保存点(wait state)。