概述
在实际业务中,多步操作需要保证数据一致性,例如转账场景。本文介绍 KingbaseES 数据库的 ksql 命令行事务管理,涵盖事务概念、基本操作、隔离级别及问题排查。
KingbaseES 数据库事务用于保证多步操作的数据一致性。内容涵盖事务基本概念与 ACID 特性,演示 BEGIN、COMMIT、ROLLBACK 核心命令及转账场景应用。包括自动提交机制、四种隔离级别配置与效果验证,以及活跃事务查看与异常终止方法。总结常见问题排查技巧,如锁表处理、脏读避免及 DDL 自动提交限制,帮助开发者有效管理数据库事务。

在实际业务中,多步操作需要保证数据一致性,例如转账场景。本文介绍 KingbaseES 数据库的 ksql 命令行事务管理,涵盖事务概念、基本操作、隔离级别及问题排查。
事务操作依赖已有的表和数据,需先完成以下准备:
执行 INSERT、UPDATE、DELETE 等操作时,用户需具有表操作权限。推荐以管理员用户 system 或已授权用户 test 建立连接。
# 连接 kingbase 数据库
ksql -d kingbase -U system
# 切换到 test_schema 模式
SET search_path TO test_schema, public;
创建账户表 account 并插入测试数据,用于演示转账场景。
-- 1. 创建账户表
CREATE TABLE IF NOT EXISTS account (
id INT PRIMARY KEY,
balance NUMERIC(10,2) NOT NULL CHECK(balance >= 0)
);
-- 2. 插入测试数据(A 账户 1000 元,B 账户 2000 元)
INSERT INTO account (id, balance) VALUES (1, 1000.00), (2, 2000.00);
-- 3. 验证数据
SELECT * FROM account;
事务是一组无法分割的 SQL 操作,要么全部执行完毕(提交),要么全部不执行(回滚)。事务应具备 ACID 特性,这是数据一致性的关键保障。
KingbaseES 通过 BEGIN、COMMIT、ROLLBACK 三个命令来控制事务。
在执行一系列原子操作之前,首先启动事务。
BEGIN;
-- 或
START TRANSACTION;
示例:
BEGIN;
UPDATE account SET balance = balance - 200 WHERE id = 1; -- A 扣款
UPDATE account SET balance = balance + 200 WHERE id = 2; -- B 入账
执行后事务处于未提交状态,数据仅在当前会话可见。
确认操作,永久生效。
COMMIT;
示例:
COMMIT;
SELECT * FROM account;
撤销操作,恢复原状。
ROLLBACK;
示例:
BEGIN;
UPDATE account SET balance = balance - 200 WHERE id = 1;
UPDATE account SET balance = balance + 200 WHERE id = 3; -- 模拟错误
ROLLBACK;
SELECT * FROM account;
KingbaseES 默认开启自动提交(auto_commit = on),每条语句视为独立事务。
SHOW auto_commit;
SET auto_commit = off; -- 关闭自动提交
关闭后所有操作需手动 COMMIT 才生效。
若多个事务同时操作同一组数据,可能产生脏读、不可重复读、幻读等问题。KingbaseES 支持 4 种标准隔离级别。
SHOW TRANSACTION ISOLATION LEVEL;
语法:SET TRANSACTION ISOLATION LEVEL 隔离级别;
-- 修改为 REPEATABLE READ
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
-- 修改为 SERIALIZABLE
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
修改后需重新启动事务(BEGIN)才会生效。
如果事务长时间未提交,会锁定相关表或行,导致其他事务无法执行。
使用系统视图 pg_stat_activity。
SELECT pid, usename, datname, query, state
FROM pg_stat_activity
WHERE state = 'active' AND query LIKE 'BEGIN%' OR query LIKE 'UPDATE%';
需管理员权限。
SELECT pg_terminate_backend(1234); -- 1234 为事务的 pid
报错信息: ERROR: could not obtain lock on row in relation "account"
解决方案: 终止该进程或查看活跃事务找到 pid 后终止。
原因: 当前隔离级别为 READ UNCOMMITTED。
解决方案: 将隔离级别提升至 READ COMMITTED 及以上。
原因: KingbaseES 对未提交的事务,断开会话时会自动回滚。
解决方案: 操作完成后务必执行 COMMIT 确认提交。
原因: DDL 语句(CREATE/ALTER/DROP)会隐式触发 COMMIT。
解决方案: 事务中避免混合 DDL 和 DML 操作。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
在线格式化和美化您的 SQL 查询(它支持各种 SQL 方言)。 在线工具,SQL 美化和格式化在线工具,online
解析 INSERT 等受限 SQL,导出为 CSV、JSON、XML、YAML、HTML 表格(见页内语法说明)。 在线工具,SQL转CSV/JSON/XML在线工具,online
CSV 与 JSON/XML/HTML/TSV/SQL 等互转,单页多 Tab。 在线工具,CSV 工具包在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online