deno-postgres 事务完全教程:begin、commit 与 rollback 的 7 个实战场景

发布时间:2026/8/20 16:30:29
deno-postgres 事务完全教程:begin、commit 与 rollback 的 7 个实战场景 deno-postgres 事务完全教程begin、commit 与 rollback 的 7 个实战场景【免费下载链接】postgresPostgreSQL driver for Deno项目地址: https://gitcode.com/gh_mirrors/postgr/postgresdeno-postgres 是 Deno 生态中最流行的 PostgreSQL 驱动它提供了一套优雅的事务 API让开发者通过begin、commit、rollback三步操作即可轻松掌控数据一致性。本文用 7 个真实场景带你从零掌握 deno-postgres 事务的完整用法包括保存点、隔离级别、链式提交等进阶技巧新手也能快速上手。一、快速入门deno-postgres 事务的基本流程在 deno-postgres 中事务的核心是createTransaction方法它由 client.ts 提供。创建事务后必须依次调用begin()、执行 SQL、再commit()或rollback()结束事务import { Client } from https://deno.land/x/postgres/mod.ts; const client new Client(); await client.connect(); const tx client.createTransaction(转账事务); await tx.begin(); // 开启事务锁定连接 await tx.queryArrayUPDATE accounts SET balance balance - 100 WHERE id 1; await tx.queryArrayUPDATE accounts SET balance balance 100 WHERE id 2; await tx.commit(); // 提交所有更改永久生效 await client.end();事务对象的核心实现位于 query/transaction.ts而begin、commit、rollback三个方法的源码分别在 query/transaction.ts、query/transaction.ts 和 query/transaction.ts。接下来看 7 个实战场景。二、7 个实战场景从入门到进阶场景 1最基础的 begin commit 多语句提交当一条业务逻辑需要多条 SQL 原子生效时事务是唯一正解。比如批量插入订单明细任何一条失败都不允许部分入库await tx.begin(); await tx.queryArrayINSERT INTO orders (user_id, total) VALUES (1, 99); await tx.queryArrayINSERT INTO order_items (order_id, sku) VALUES (1, A001); await tx.commit(); 注意begin()之后连接会被事务锁定此时用 client 直接执行查询会报错必须通过事务对象的queryArray/queryObject执行源码见 client.ts。场景 2rollback 回滚——失败时的数据急救如果事务中途发生错误调用rollback()即可撤销本次事务内所有更改就像什么都没发生过await tx.begin(); await tx.queryArrayINSERT INTO orders (user_id, total) VALUES (1, 99); try { await tx.queryArrayINSERT INTO orders (user_id, total) VALUES (2, ${abc}); // 类型错误 } catch { await tx.rollback(); // 回滚第一条插入也被撤销 }注意一旦数据库执行错误导致事务中止后续commit()会抛出TransactionError其定义在 client/error.ts。场景 3savepoint 保存点——只撤销部分操作很多时候我们只想回滚到事务中的某一步而不是全部撤销。这时就要用savepoint保存点实现局部回滚await tx.begin(); await tx.queryArrayINSERT INTO orders (user_id, total) VALUES (1, 99); // 想保留 const sp await tx.savepoint(before_failure); await tx.queryArrayDELETE FROM stock WHERE sku A001; // 出错的操作 await tx.rollback(sp); // 只撤销保存点之后的操作 await tx.commit(); // 第一条插入成功保存保存点支持名字、Savepoint对象、{ savepoint }三种传参方式还可以用update()和release()调整保存点位置相关实现见 query/transaction.ts。场景 4read_committed 与 repeatable_read 隔离级别选择createTransaction的第二个参数可配置隔离级别这在并发场景下至关重要// 默认 read_committed事务内能看到其他已提交事务的最新数据 const tx1 client.createTransaction(t1); // repeatable_read事务开始后外部提交的更改在事务内不可见 const tx2 client.createTransaction(t2, { isolation_level: repeatable_read, });deno-postgres 支持read_committed、repeatable_read、serializable三种级别类型定义见 query/transaction.tsbegin()时由源码 query/transaction.ts 自动拼装对应的 SQL。场景 5read_only 只读事务——数据提取的安全模式对于报表、数据导出等只读业务推荐开启read_only从源头杜绝误写数据const tx client.createTransaction(只读报表, { read_only: true, isolation_level: repeatable_read, }); await tx.begin(); const { rows } await tx.queryObjectSELECT * FROM sales WHERE date 2024-01-01; await tx.commit();只读模式下执行任何写操作都会报错为数据安全加了一层保险配置逻辑见 query/transaction.ts。场景 6chain 链式提交——一个语句完成提交重开当需要把大批数据分批提交时commit({ chain: true })可以在提交当前事务的同时用相同参数立即开启新事务省去反复 begin 的开销await tx.begin(); // 处理第 1 批数据 await tx.commit({ chain: true }); // 提交并立即开启新事务 // 处理第 2 批数据仍在事务中 await tx.commit(); // 最终提交同理rollback({ chain: true })会在回滚后立即重启事务适合定时任务中的循环处理见 query/transaction.ts。场景 7getSnapshot 快照共享 连接池事务deno-postgres 支持用getSnapshot()导出当前事务快照让另一个事务从完全相同的起点开始实现数据一致性对比const tx1 client1.createTransaction(t1); await tx1.begin(); const snapshot await tx1.getSnapshot(); const tx2 client2.createTransaction(t2, { isolation_level: repeatable_read, snapshot, }); await tx2.begin(); // tx2 看到的数据与 tx1 起点完全一致若使用连接池务必在事务结束后调用client.release()归还连接PoolClient还支持Symbol.dispose自动释放见 client.ts。三、新手避坑指南4 个常见报错报错信息原因解决办法This transaction has not been started yet忘记调用begin()先begin()再执行查询This transaction is already open重复begin()检查事务生命周期The transaction xx has been aborted事务因 SQL 错误中止捕获异常后rollback()This connection is currently locked事务未结束时用 client 直查统一通过事务对象查询所有事务 API 均从 mod.ts 统一导出Transaction、Savepoint等类型TransactionOptions、IsolationLevel也在 mod.ts 中方便你按需引入。四、总结deno-postgres 的事务设计清晰且功能完整begin开启、commit提交、rollback回滚配合savepoint、隔离级别、read_only、链式操作和快照共享几乎覆盖了所有生产场景。掌握这 7 个实战场景你的 Deno 应用数据安全就有了坚实保障。【免费下载链接】postgresPostgreSQL driver for Deno项目地址: https://gitcode.com/gh_mirrors/postgr/postgres创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考