数据库操作
对 Zion 内置的数据库执行增删改查操作。
| 行为 | 说明 | 系统表与系统字段限制 |
|---|---|---|
| 添加 | 向指定的数据表中插入一条或多条新数据。 | 无法选择任意系统表。 |
| 修改 | 修改指定数据表中符合条件的一条或多条现有数据。 | 无法修改系统表和系统字段的数据(账户表除外,可修改用户名、用户头像以及自行添加字段)。 |
| 删除 | 从指定的数据表中移除符合条件的一条或多条数据。 | 无法选择任意系统表。 |
| 事务处理 | 将多个数据库变更操作 (添加、修改、删除) 打包执行。具备事务性,确保要么全部成功,要么全部失败。 | 和上述规则一致。 |
更多系统表和字段的信息请参考系统表与系统字段
添加
向指定的数据表中插入一条或多条新数据。
常用场景
- 用户提交表单后,将表单内容保存到数据库中。
- 批量导入多条记录到指定数据表。
参数配置
行为参数配置
| 参数 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
| 数据表 | 表对象 | 是 | 选择目标数据表。无法选择用户表,且表必须是可修改的。 |
| 批量添加 | 布尔值 | 否 | 开启后支持批量添加多条数据。 |
| 数据源 | 数组 | 否 | 仅在开启批量添加数据时显示,用于绑定包含多条数据的数组。绑定数据源后,在给数据表字段绑定值时,在数据绑定菜单中的”循环项 -> 行为 -> 当前项”中选择到数组中的数据。 |
| 参数 | 对象 | 否 | 为数据表中的具体字段赋值。如果字段有默认值,下方会显示默认值提示。 |
| 字段校验 | 对象 | 否 | 配置字段的校验规则,支持微信内容安全检查、是邮箱、为空、非空、是电话号码、自定义正则表达式。 |
| 数据冲突处理 | 枚举 | 否 | 选择用于检测冲突的唯一字段或数据表约束(即冲突依据)。 |
| 处理方式 | 枚举 | 否 | 配置发生冲突时的处理方式。可选择“忽略并跳过”或“修改原有数据”。仅在配置了数据冲突处理后显示。 |
在数据库中,只有 SQL 语句中根本没有出现该字段时,数据库才会用默认值填充。 对应到行为参数配置,只有字段上没有绑定任何值(包括空值)时,请求中才不会出现该字段。此时默认值才会生效。
其他配置
- 字段校验配置
用于在添加数据前,校验某个字段的数据是否合法。同一个字段可以添加多个校验条件,只有所有条件都满足,校验才通过,才会真正发起请求。未通过则不发起请求,并进入“失败时”分支,并显示提示信息。
配置方式为:点击“参数”标题旁的“字段校验”,在出现的弹窗中添加需要校验的数据表字段,并为每个字段添加校验条件和提示。
- 数据冲突处理
若数据表中配置了唯一约束,在添加数据时,如果数据重复,可以通过配置数据冲突处理来决定后续操作。
配置方式为:在“数据冲突处理”参数项选择唯一约束,并选择“处理方式”:
-
忽略并跳过:不添加冲突的那一行数据,其他的正常添加。
-
修改原有数据:用新的数据覆盖冲突的那一行数据。
运行结果与输出
- 行为结果:如果是单条添加,会返回添加的数据;如果是批量添加,会返回添加的数据数组的首位元素(通常是 id 最小的那一条)。
- 成功时:数据成功插入数据库后触发;批量添加时,在所有数据添加成功时触发一次。
- 失败时:数据插入操作被阻断或执行异常时触发。
运行机制
Zion 的“添加”行为用于在数据库中创建新记录。这一动作的流转是一个涉及前端预校验、数据预处理、网络加密传输、后端行级权限审查以及物理事务提交的完整闭环,具体运行机制和端到端全生命周期如下:
- 前端收集参数:
- 单条添加:当用户触发行为时,前端页面引擎立即收集对应输入组件的值(如输入框的文本、下拉选择的值),组装成一个单独的数据对象。
- 批量添加:读取绑定的数组数据源,遍历数组成员,将每一个元素的字段动态映射为数据表的字段。
-
执行本地校验:自动检查前端配置的“字段校验规则”。一旦发现任何字段不满足格式规则,前端会立刻终止后续的发送流程,直接宣告行为失败并流转至“失败时”分支,绝不向后端发起无意义的网络请求。
-
参数预处理:自动处理媒体类型字段的数据绑定,将媒体类型字段的数据绑定转换为媒体文件的 id,并重写参数键名。
-
组装 GraphQL 报文:参数预处理完毕后,将单条添加组装为
insert_xxx_one的 GraphQL 树,批量添加组装为insert_xxx的对象数组,完整结构见API 结构文档 - 添加数据。 -
网关身份校验:请求通过 HTTPS 传输至 Zion 服务端的统一网关。网关解析请求 Header 中注入的 JWT 会话令牌,校验当前用户身份,并将解析出的受信任用户属性,作为后续权限控制的合法事实源。
-
统一事务包裹:
- 单条添加:后端在单个数据库事务内执行物理
INSERT INTOSQL。 - 批量添加:其本质是**“前端单请求组装 + 后端事务包裹的循环添加”**。后端在最外层开启一个统一的 PostgreSQL 事务,按序循环为每一个数组元素生成并执行独立的
INSERT INTOSQL,并处理好表级级联关系,确保“同生共死”。
⚠️因为批量添加在数据库底层需要为每一个数组成员循环生成独立的 SQL 并维护事务边界,在面对超大规模数据时极易带来长事务锁表和连接池占满的系统级风险。因此,前端引擎在组装批量请求时,限制了单次批量添加的最大数据量为 1000 条。若超出限制,只保留前 1000 条数据继续执行,超出的部分会被自动丢弃。
- 单条添加:后端在单个数据库事务内执行物理
-
权限和数据冲突审查:
- 数据写入磁盘前,物理数据库引擎会自动检查表级权限、行级权限。
- 数据冲突处理:如果插入的数据与已有记录在唯一字段上发生冲突,若处理方式设为 “忽略并跳过”,数据库会静默忽略该冲突行不予添加,继续执行其他非冲突行的插入;若处理方式设为 “修改原有数据”,则会触发 Upsert 机制,将已有冲突行的数据覆盖更新为新传入的值。
-
提交与回滚:
- 全员成功:若所有单条/批量添加动作全部顺利执行完毕且通过校验,后端正式提交事务并回传出参。前端页面引擎在获得回执后触发行为流的 “成功时” 分支。
- 任意失败触发回滚:若添加动作中任意一步触发了报错(如唯一性冲突未配置处理方式、敏感内容违反了微信安全检测、必填项缺失、外键 id 不存在等),数据库会强行回滚整个事务。前端接收到异常回执后,直接流转到行为的 “失败时” 分支。
常见错误
发生以下错误时,均会进入失败时分支:
- 参数校验未通过:前端本地的基础规则校验未满足或未通过微信内容安全检查。
- 数据冲突(违反唯一约束):插入的数据与已有数据重复,且未配置数据冲突处理。
- 权限不足:当前用户的角色没有该表的添加权限,或者提交的数据违反了权限设置。
- 数据库约束报错:必填字段缺失导致后端落盘失败,或绑定的关联表 id(外键)在数据库中并不存在。
- 网络或服务异常:用户设备断网、请求发送超时,或后端服务器内部处理故障(500 错误)。
用法举例
提交反馈表单 (小程序端 / Web 端)
提交反馈表单 (小程序端 / Web 端)**
-
需求: 用户在意见反馈页面填写内容并点击提交按钮后,将反馈内容保存到反馈数据表中,并提示提交成功。
-
配置流程:
- 前置准备:
- 在 “数据 -> 数据模型” 面板创建 “反馈” 数据表,包含 “内容” 字段;
- 创建 “意见反馈” 页面;
- 在 “意见反馈” 页面中配置好一个
输入框(用于输入反馈内容) 和一个按钮(用于提交反馈)。
- 选择组件:在 “意见反馈” 页面画布上,选中
按钮(用于提交反馈)。 - 添加行为:在右侧配置面板中切换到 “行为” 标签页,直接在 “点击时” 事件下点击添加操作。
- 配置行为基础参数:
- 在行为选择下拉框中,搜索并选中 “添加”。
- 在数据表下拉框中选择 “反馈”。
- 绑定参数传递:
- 在参数列表中找到 “内容” 字段,点击该输入框右侧的 “+” 加号按钮,在弹出的数据源中依次展开并选择精确路径:
组件 -> [输入框的名称] -> 组件输出。
- 在参数列表中找到 “内容” 字段,点击该输入框右侧的 “+” 加号按钮,在弹出的数据源中依次展开并选择精确路径:
- 配置成功回调:
- 在 “成功时” 下方点击添加操作,选择 “显示提示”,配置提示内容为 “提交成功”。
- 再次点击添加操作,选择 “跳转页面”,配置返回上页。
- 运行结果: 用户在输入框中输入反馈内容并点击按钮后,系统将内容保存至反馈数据表,并在页面顶部弹出 “提交成功” 的提示,随后返回上页。
用户点赞/收藏 (利用唯一约束与冲突忽略防重复点击)
-
需求: 用户在文章详情页点击“点赞”按钮。当用户多次或快速重复点击点赞时,不希望在数据库中产生多条重复记录,也不希望向用户抛出数据库联合唯一索引报错。
-
配置流程:
- 前置准备:
- 在 “数据 -> 数据模型” 面板中创建 “点赞记录” 数据表。
- 为 “点赞记录” 表创建
用户id和文章id字段,并在数据表的高级配置中,将这两个字段添加为“联合唯一索引(联合唯一约束)”。 - 准备好包含“点赞按钮”的文章详情页面。
- 选择组件:在画布上,选中 “点赞按钮”。
- 添加行为:在右侧配置面板中切换到 “行为” 标签页,在 “点击时” 事件下点击添加操作。
- 配置行为基础参数:
- 在行为选择下拉框中,搜索并选中 “添加”。
- 在数据表下拉框中选择 “点赞记录”。
- 绑定参数传递:
- 在参数列表中,找到
用户id字段,点击输入框右侧的 “+” 加号按钮,选择精确路径:上下文 -> 当前用户 -> id。 - 找到
文章id字段,点击输入框右侧的 “+” 加号按钮,选择精确路径:页面/组件数据 -> [文章数据源] -> id。
- 在参数列表中,找到
- 配置冲突处理 (核心步骤):
- 在参数配置底部的 “数据冲突处理” 中,下拉选择前面创建的联合唯一索引。
- 将 “处理方式” 设置为 “忽略并跳过”。
- 配置成功回调:
- 在 “成功时” 下方点击添加操作,选择 “显示提示”,配置提示内容为 “点赞成功!”(Zion 机制:当发生冲突触发忽略时,仍会视为行为执行成功,从而执行成功回调,提供友好的界面反馈,但数据库内不会产生重复数据)。
- 运行结果: 用户首次点击时,成功在数据库插入一条点赞记录并提示“点赞成功!”;后续任何重复点击由于触发了唯一约束,系统均会自动检测冲突并静默执行“忽略并跳过”,不会产生数据库异常,数据保持唯一。
修改
修改指定数据表中符合条件的一条或多条现有数据。
常用场景
- 用户在个人中心修改自己的个人资料。
- 更改订单的状态 (如从待支付修改为已支付)。
参数配置
| 参数 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
| 数据表 | 对象 | 是 | 选择目标数据表。允许选择用户表,表必须是可修改的。 |
| 参数 | 对象 | 否 | 为需要修改的字段赋新值。对于长整数和无限精度小数类型字段,可选择算术运算符(设为、增加、减少)。 |
| 参数校验 | 对象 | 否 | 配置字段的校验规则,支持微信内容安全检查、是邮箱、为空、非空、是电话号码或自定义正则表达式。 |
| 数据筛选 | 对象 | 是 | 配置筛选条件,决定修改哪些数据。筛选条件中可绑定“表数据” |
若需要全量更新所有数据,可以设置一个所有数据必满足的条件,例如: “id > 0”。
运行结果与输出
- 结果:对多行操作均仅返回第一条记录。若需在后续步骤中引用,可在参数绑定中选择
行为结果 -> [当前操作的名称] -> id。 - 成功时:数据成功修改后触发,可配置刷新数据源或显示提示。
- 失败时:数据修改失败 (如参数校验未通过、无符合条件的数据) 时触发,可配置错误提示。
运行机制
Zion 的“修改”行为用于更新数据库中符合特定筛选条件的一条或多条现有数据。其流转生命周期具体运行机制如下:
- 前端收集筛选条件与更新参数:
- 选择数据筛选:如果配置了多个「数据筛选」条件,前端引擎会自上而下顺次对各个筛选进行条件检验:
- 首个命中即停:一旦发现某个筛选条件成立,系统会立即锁定并选取该分支下的筛选参数,同时完全忽略后面配置的所有筛选。如果所有筛选条件都不成立,则采用
Default筛选。 - 最终装配:最终只会将这个唯一的筛选条件编译入 GraphQL 请求中。
- 首个命中即停:一旦发现某个筛选条件成立,系统会立即锁定并选取该分支下的筛选参数,同时完全忽略后面配置的所有筛选。如果所有筛选条件都不成立,则采用
-
执行字段校验:自动检查前端配置的「字段校验」规则。一旦发现任何修改的数据不满足规则,前端会立刻终止后续的发送流程,直接宣告行为失败并流转至“失败时”分支。
-
参数预处理:自动处理媒体类型字段的数据绑定,将绑定的媒体对象转换为媒体中心的唯一
id,并重写参数键名为[字段名]_id(长整型外键)。 -
组装 GraphQL 报文:将筛选条件转换为 GraphQL 的
where条件对象,设值或原子增减数值转换装载至_set或者是_inc中,具体格式请参考 API 结构文档 - 修改数据。 -
网关身份校验:请求通过 HTTPS 传输至网关。网关解析 JWT 会话令牌,校验当前用户身份,并将解析出的受信任用户属性作为安全会话上下文下发给后端。
-
统一事务包裹:后端将 GraphQL 变更为对应 PostgreSQL 的原子扣减/覆盖 SQL,在同一个数据库事务隔离边界内顺序执行。针对库存累减,物理 SQL 如下:
UPDATE "goods" SET "stock" = "stock" + $1 WHERE "id" = $2 AND "stock" >= $3;由于更新在事务内是串行排他的,能从底层完美解决并发和脏读问题。
-
权限和数据冲突审查:
- 数据写入磁盘前,会检查权限规则。即使恶意用户通过抓包删去了前端行为中的数据筛选条件(如删去了
库存数 >= 购买数量绕过校验),后端依旧会强制在 SQL 层面拼入权限限制(如AND "stock" >= 0)。 - 数据冲突处理:如果修改后的数据与已有记录在唯一字段上发生冲突,则直接终止并抛出错误。
- 数据写入磁盘前,会检查权限规则。即使恶意用户通过抓包删去了前端行为中的数据筛选条件(如删去了
-
提交与回滚:
- 成功:行数发生变更,提交事务,数据永久生效,前端流向行为的 “成功时” 分支。
- 失败:触发了权限拦截、数据冲突导致报错。事务自动回退,前端流向行为的 “失败时” 分支。
常见错误
- 参数校验失败:修改的数据不符合在参数校验中配置的规则,导致修改被拒绝。
- 筛选条件错误:数据筛选条件配置不当,导致未匹配到任何数据或错误地修改了其他数据。
用法举例
修改个人昵称 (小程序端 / Web 端)
-
需求: 用户在个人资料页面修改昵称,点击保存按钮后,修改用户表中的昵称字段。
-
配置流程:
- 前置准备:
- 确认 “数据” 面板中存在 “用户” 数据表及 “昵称” 字段;
- 创建 “修改资料” 页面;
- 在 “修改资料” 页面中配置好一个
输入框(用于输入昵称) 和一个按钮(用于保存资料)。
- 选择组件:在 “修改资料” 页面画布上,选中
按钮(用于保存资料)。 - 添加行为:在右侧配置面板中切换到 “行为” 标签页,直接在 “点击时” 事件下点击添加操作。
- 配置行为基础参数:
- 在行为选择下拉框中,搜索并选中 “修改”。
- 在数据表下拉框中选择 “用户”。
- 配置数据筛选,定位到当前登录用户。
- 数据筛选条件配置:设置条件为
id等于当前登录用户的id。点击右侧的 “+” 加号按钮,选择精确路径:全局数据 -> 当前登录用户 -> id。 - 绑定参数传递:
- 在参数列表中找到 “昵称” 字段,点击该输入框右侧的 “+” 加号按钮,在弹出的数据源中依次展开并选择精确路径:
组件 -> [输入框的名称] -> 值。
- 在参数列表中找到 “昵称” 字段,点击该输入框右侧的 “+” 加号按钮,在弹出的数据源中依次展开并选择精确路径:
- 配置成功回调:
- 在 “成功时” 下方点击添加操作,选择 “显示提示”,配置提示内容为 “修改成功”。
- 运行结果: 用户输入新昵称并点击按钮后,系统会修改当前用户的昵称信息,并弹出 “修改成功” 的提示。
2. 商品库存精准扣减 (长整数减法 + 充足库存筛选防超卖)
-
需求: 在电商下单或秒杀场景中对商品的库存进行扣减。为了实现绝对精准的库存控制,并防止在高并发场景下出现超卖(库存被扣成负数),必须在修改行为的数据筛选条件中限制“当前库存必须大于或等于购买数量”,并配合长整数的算术运算符“减少”,执行数据库层面的原子级扣减。
-
配置流程:
- 前置准备 (服务端/数据库双重防御机制):
- 确保该数据表中的 “库存数” 字段类型为 长整数。
- 准备好包含购买数量选择器和“立即购买”按钮的商品详情页。
- 行级权限 (RLS):在 “数据 -> 权限配置” 菜单中,找到对应的商品数据表,编辑该表在“更新”权限下的 行级权限 (RLS) 规则。设置过滤公式限制更新后的
库存数 >= 0。即使恶意攻击者通过篡改前端删去了前端行为中的数据筛选条件,一旦触发扣减为负值,也会瞬间在 Zion 服务端被 RLS 拦截拒绝,使得操作完美流转到“失败时”回调,彻底杜绝前端参数篡改。
- 选择组件:在画布上,选中 “立即购买” 按钮。
- 添加行为:在右侧配置面板中切换到 “行为” 标签页,在 “点击时” 事件下点击添加操作。
- 配置行为基础参数:
- 在行为选择下拉框中,搜索并选中 “修改”。
- 在数据表下拉框中选择 “商品”。
- 配置数据筛选 (体验层防线):
- 添加第一个条件:
id等于当前购买商品的id。 - 添加第二个条件:
库存数大于或等于 购买数量。点击右侧的 “+” 加号按钮,选择精确路径绑定为当前组件上用户选择的购买数量:组件 -> [购买数量计数器] -> 组件输出。
- 添加第一个条件:
- 绑定参数传递 (原子扣减):
- 在下方的参数列表中找到
库存数字段。 - 点击算术运算符下拉框,选择 “减少”。
- 在输入框右侧点击 “+” 加号按钮,同样绑定为用户的购买数量:
组件 -> [购买数量计数器] -> 组件输出。
- 在下方的参数列表中找到
- 配置成功与失败回调:
- 在 “成功时” 分支:代表扣减成功,可以添加跳转至支付页面或生成订单的行为。
- 在 “失败时” 分支:添加 “显示提示”,配置提示内容为 “库存不足,抢光啦!”(Zion 机制:当剩余库存小于用户购买数量时,由于筛选条件不满足,或者由于触发了权限限制,系统都会直接判定该修改操作失败并流转至“失败时”分支)。
- 运行结果: 在高并发多用户同时抢购同一商品时,若剩余库存充足,每个人的扣减指令都将在数据库层面原子化串行排队执行;一旦库存被扣至临界值以下(或者由于前端篡改试图强行扣减为负值),后续的请求将被体验层筛选拦截,或被权限系统拦截,直接安全流转至“失败时”分支,保证库存数据绝对不会发生“负数超卖”的灾难。
删除
从指定的数据表中移除符合条件的一条或多条数据。
常用场景
- 用户在购物车列表中移除某件商品。
- 管理员在后台管理系统中删除违规的评论。
参数配置
| 参数 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
| 数据表 | 对象 | 是 | 选择目标数据表。无法选择用户表,且表必须是可修改的。 |
| 数据筛选 | 对象 | 否 | 配置筛选条件,决定删除哪些数据。 |
运行结果与输出
- 结果:对多行操作均仅返回第一条记录。若需在后续步骤中引用,可在参数绑定中选择
行为结果 -> [当前操作的名称] -> id。 - 成功时:数据成功删除后触发。
- 失败时:删除失败(如无删除权限)时触发。
运行机制
Zion 的“删除”行为用于从指定数据表中永久移除符合条件的一条或多条数据。其流转生命周期具体运行机制如下:
- 前端收集筛选条件:
- 选择数据筛选:如果配置了多个「数据筛选」条件,前端引擎会自上而下顺次对各个筛选进行条件检验:
- 首个命中即停:一旦发现某个筛选条件成立,系统会立即锁定并选取该分支下的筛选参数,同时完全忽略后面配置的所有筛选。如果所有筛选条件都不成立,则采用
Default筛选。 - 最终装配:最终只会将这个唯一的筛选条件编译入 GraphQL 请求中。
-
执行字段校验:无参数需要校验。
-
参数预处理:由于不进行数据写入,因此无多媒体等数据类型降维等预处理。
-
组装 GraphQL 报文:将获取到的参数组装成带有
where过滤参数的标准delete_xxx格式的 GraphQL 报文,具体格式请参考 API 结构文档 - 删除数据。 -
网关身份校验:请求通过 HTTPS 传输至网关。网关解析 JWT 会话令牌,建立包含当前用户的受信任会话上下文下发给后端。
-
统一事务包裹:请求由后端接收,后端在编译 SQL 前会静默注入权限系统的 RLS 行级安全限制条件。
-
行级权限与物理约束审查:
- 后端将
where条件直接翻译编译为原生的 SQL 并在数据库执行:DELETE FROM "order" WHERE "id" = $1 AND "user_id" = $2; - 数据库引擎尝试物理删除。与其建立关联的其他表中引用该数据的字段,默认会被自动置空(设为 NULL)。
- 后端将
-
提交与回滚:
- 成功:物理删除成功,数据库提交事务,前端接收回执并流向行为的 “成功时” 分支,刷新数据源。
- 失败:权限拦截失败。事务自动回滚,流向行为的 “失败时” 分支。
常见错误
- 筛选条件缺失:未配置数据筛选条件,导致误删全表数据。
- 关联数据限制:尝试删除的数据被其他表的外键关联,导致数据库拒绝删除请求。
用法举例
删除历史订单 (小程序端 / Web 端)
-
需求: 用户在订单列表页面点击某条订单的删除按钮,将该订单从数据库中移除。
-
配置流程:
- 前置准备:
- 在 “数据” 面板创建 “订单” 数据表;
- 创建 “订单列表” 页面;
- 在 “订单列表” 页面中配置好一个
列表,并在列表项内放置一个按钮(用于删除订单)。
- 选择组件:在 “订单列表” 页面画布上,选中列表项内的
按钮(用于删除订单)。 - 添加行为:在右侧配置面板中切换到 “行为” 标签页,直接在 “点击时” 事件下点击添加操作。
- 配置行为基础参数:
- 在行为选择下拉框中,搜索并选中 “删除”。
- 在数据表下拉框中选择 “订单”。
- 配置数据筛选:
- 在数据筛选中添加条件,设置
id等于当前列表项的订单id。点击右侧的 “+” 加号按钮,选择精确路径:当前列表项 -> 订单记录 -> id。 - 增加安全校验条件,设置
user_id等于当前登录用户的id。点击右侧的 “+” 加号按钮,选择精确路径:全局数据 -> 当前登录用户 -> id。
- 在数据筛选中添加条件,设置
- 配置成功回调:
- 在 “成功时” 下方点击添加操作,选择 “刷新数据源”,更新当前列表。
- 运行结果: 用户点击删除按钮后,系统会将对应的订单数据从数据库中永久移除,并自动刷新列表展示最新数据。
事务处理
将多个数据库变更操作 (添加、修改、删除) 打包执行,确保按照配置的顺序执行,确保事务性(要么全部成功,要么全部失败并自动撤销并恢复原状)。
常用场景
- 提交包含主表和子表数据的复杂表单 (如同时添加订单和订单明细)。
- 资金转账场景,同时扣减 A 账户余额并增加 B 账户余额。
参数配置
| 参数 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
| 行为 | 数组 | 是 | 事务内执行的行为列表。只能添加添加、修改、删除这三种行为。 |
运行结果与输出
- 结果:无
- 成功时:事务内所有行为均执行成功后触发。
- 失败时:事务内任意一个行为执行失败时触发,所有已执行的变更将被自动撤销并恢复原状。
运行机制
Zion 的“事务处理”行为用于在单个请求中以原子事务的方式批量执行多个数据库写操作(添加、修改、删除)。其流转生命周期具体运行机制如下:
- 前端链式收集参数
- 顺序收集:前端页面引擎按顺序收集事务行为列表中配置的每一个行为的设值与筛选条件。
- 子回调隐藏:为保障事务整体的强原子性,子动作的成功/失败事件被强制隐藏且禁用。只暴露事务整体的成功或失败时。因此事务内的行为不支持引用前一步的执行结果(如修改商品库存去引用前一步添加订单生成的动态
订单id)。
-
执行字段校验:依次对列表内的所有子行为执行基础规则本地校验,任一不通过则整体拦截并触发整体事务的“失败时”。
-
参数预处理:自动处理媒体类型字段的数据绑定,将绑定的媒体对象转换为媒体中心的唯一
id,并重写参数键名为[字段名]_id(长整型外键)。 -
组装 GraphQL 报文:页面引擎将所有添加、修改或删除子行为统一拼接在同一个请求中发出,具体格式请参考 API 结构文档 - 事务处理。
-
网关身份校验:请求通过 HTTPS 传输至网关。网关解析 JWT 验证当前用户身份,并构建受信任的安全会话上下文流转至后端服务器。
-
统一事务包裹:Zion 后端接收请求时,会立刻为当前 HTTP 请求开启一个 PostgreSQL 级别的 物理事务隔离边界,多个子别名操作会在物理事务内被后端按严格配置的先后顺序同步顺序执行。
-
行级权限与物理约束审查:数据库顺序执行 SQL,任何一步触发异常都会被拦截器捕捉,并强制数据库执行整体回滚。
-
提交与回滚:
- 成功:若所有配置的操作全部无报错且成功执行,后端提交整个物理数据库事务,数据永久生效,触发顶层 “成功时” 回调。
- 失败:执行序列中只要有任意一步触发了异常,后端拦截器立即自动发出回滚命令,撤销全部修改,并流转至事务整体的 “失败时” 回调。
常见错误
- 包含不支持的行为:在事务行为列表中添加了非数据库变更行为 (如跳转页面、网络请求),导致事务配置无效。
- 单步行为失败导致整体回滚:事务内某个修改操作因筛选条件未匹配到数据或参数校验失败,导致整个事务被自动撤销并恢复原状。
用法举例
提交订单并扣减库存 (小程序端 / Web 端)
-
需求: 用户在商品详情页点击购买按钮,系统需要同时在订单表中添加一条新订单,并在商品表中扣减该商品的库存。这两个操作必须同时成功或同时失败。
-
配置流程:
- 前置准备:
- 在 “数据” 面板创建 “订单” 数据表和 “商品” 数据表;
- 创建 “商品详情” 页面;
- 在 “商品详情” 页面中配置好一个
按钮(用于购买商品)。
- 选择组件:在 “商品详情” 页面画布上,选中
按钮(用于购买商品)。 - 添加行为:在右侧配置面板中切换到 “行为” 标签页,直接在 “点击时” 事件下点击添加操作。
- 配置行为基础参数:
- 在行为选择下拉框中,搜索并选中 “事务处理”。
- 配置事务内行为:
- 在行为列表中点击添加操作,选择 “添加”,配置目标数据表为 “订单”,并绑定相关参数。
- 再次在行为列表中点击添加操作,选择 “修改”,配置目标数据表为 “商品”,设置数据筛选条件为当前商品
id。 - 在修改操作的参数中,将库存字段设置为 “减少” 。
- 配置成功回调:
- 在 “成功时” 下方点击添加操作,选择 “显示提示”,配置提示内容为 “购买成功”。
- 再次点击添加操作,选择 “跳转页面”,配置跳转至订单列表页。
- 运行结果: 用户点击购买按钮后,系统会打包执行添加订单并扣减库存的操作。若库存扣减失败,已添加的订单也会被自动撤销并恢复原状,确保数据一致性。成功后弹出 “购买成功” 提示并跳转页面。