跳到主要内容

流程事务

事务简介

数据库事务是指一组操作的集合,这些操作要么全部成功,要么全部失败。事务具有四个关键特性,通常称为 ACID 属性:

  1. 原子性(Atomicity):事务是不可分割的最小执行单位,要么全部执行,要么全部不执行。
  2. 一致性(Consistency):事务执行前后,数据库保持一致状态。
  3. 隔离性(Isolation):并发执行的事务彼此隔离,互不影响。
  4. 持久性(Durability):事务一旦提交,其结果是永久性的,即使系统崩溃也不会丢失。

事务必须在同一个执行体中

事务通常需要在同一个执行体中进行管理,比如在一次数据库连接或会话中。原因包括:

  • 一致性:在同一个执行体中,数据库可以确保事务的完整性和一致性。
  • 锁管理:事务需要在同一个连接中管理锁,以避免资源冲突和死锁。
  • 资源管理:同一执行体中更容易管理和释放资源,如连接和内存。

REST 请求破坏事务的原因

REST 请求通常是无状态的,每个请求独立处理。这种特性可能会破坏事务的连续性:

  • 连接中断:每个 REST 请求通常打开一个新的数据库连接,无法保证事务的连续性。
  • 状态丢失:事务状态无法在多个独立的 REST 请求间持久化。
  • 隔离性问题:不同请求可能在不同的节点或服务中处理,无法保证事务的隔离性。

因此,事务需要在单个执行体中进行管理,而不是跨多个 REST 请求。

Rest 流程中的事务模式

将一个rest接口包装成一个事务,当流程节点出错或者主动将流程以失败结束时,回滚整个流程。

Rest触发器配置

Form节点触发流程的事务模式

Form节点触发的事务模式有两个条件:

  1. 必须是Form节点触发且选择事务运行
    Form触发器配置
  2. 第二个节点必须是表单节点
    第二个节点必须是表单节点

Form节点触发流程的事务模式的效果

以一个简单的审批流程为例
alt text
当配置了一个表单流程是事务流程后, 表单或者审批节点之间形成一个实物运行。
比如节点3 groovy节点出错,会将表单节点2和groovy节点中对数据库的操作一并回滚。

其中有一个优势就是对于审批节点,如果审批后续节点出错,可以自然的回退到审批节点等待修复流程或者数据后进行再次审批。