news 2026/5/1 9:07:31

Node生态中最优雅的数据库事务处理机制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Node生态中最优雅的数据库事务处理机制

使用装饰器启用事务

事务传播机制

事务补偿机制

确保数据库与缓存数据一致性

使用装饰器启用事务

import { Database } from 'vona-module-a-orm';

class ServicePost {

@Database.transaction()

async transaction() {

// insert

const post = await this.scope.model.post.insert({

title: 'Post001',

});

// update

await this.scope.model.post.update({

id: post.id,

title: 'Post001-Update',

});

}

}

手工启用事务

1. 使用当前数据源

class ServicePost {

async transactionManually() {

const db = this.bean.database.current;

await db.transaction.begin(async () => {

await this.scope.model.post.update({ id: 1, title: 'Post001_Update' });

});

}

}

2. 使用指定数据源

class ServicePost {

async transactionManually() {

const db = this.bean.database.getDb({ clientName: 'default' });

await db.transaction.begin(async () => {

const modelPost = this.scope.model.post.newInstance(db);

await modelPost.update({ id: 1, title: 'Post001_Update' });

});

}

}

事务参数

class ServicePost {

@Database.transaction({

+ isolationLevel: 'READ_COMMITTED',

+ propagation: 'REQUIRED'

})

async transaction() {

...

}

}

class ServicePost {

async transactionManually() {

const db = this.bean.database.getDb({ clientName: 'default' });

await db.transaction.begin(

async () => {

...

},

{

+ isolationLevel: 'READ_COMMITTED',

+ propagation: 'REQUIRED',

}

);

}

}

事务参数:isolationLevel

名称 说明

DEFAULT 数据库相关的缺省isolationLevel

READ_UNCOMMITTED

READ_COMMITTED

REPEATABLE_READ

SERIALIZABLE

SNAPSHOT

事务参数:propagation

Vona ORM 支持数据库事务传播机制

名称 说明

REQUIRED 默认的事务传播级别。如果当前存在事务, 则加入该事务。如果当前没有事务, 则创建一个新的事务

SUPPORTS 如果当前存在事务,则加入该事务. 如果当前没有事务, 则以非事务的方式继续运行

MANDATORY 强制性。如果当前存在事务, 则加入该事务。如果当前没有事务,则抛出异常

REQUIRES_NEW 创建一个新的事务。如果当前存在事务, 则把当前事务挂起。也就是说不管外部方法是否开启事务,总是开启新的事务, 且开启的事务相互独立, 互不干扰

NOT_SUPPORTED 以非事务方式运行。如果当前存在事务,则把当前事务挂起(不用)

NEVER 以非事务方式运行。如果当前存在事务,则抛出异常

事务补偿机制

当事务成功或者失败时执行一些逻辑

1. 成功补偿

this.bean.database.current.commit(async () => {

// do something when success

});

2. 失败补偿

this.bean.database.current.compensate(async () => {

// do something when failed

});

事务与Cache数据一致性

许多框架使用最简短的用例来证明是否高性能,而忽略了业务复杂性带来的性能挑战。随着业务的增长和变更,项目性能就会断崖式下降,各种优化补救方案让项目代码繁杂冗长。而 Vona 正视大型业务的复杂性,从框架核心引入缓存策略,并实现了二级缓存、Query缓存和Entity缓存等机制,轻松应对大型业务系统的开发,可以始终保持代码的优雅和直观

Vona 系统对数据库事务与缓存进行了适配,当数据库事务失败时会自动执行缓存的补偿操作,从而让数据库数据与缓存数据始终保持一致

针对这个场景,Vona 提供了内置的解决方案

1. 使用当前数据源

class ServicePost {

@Database.transaction()

async transaction() {

// insert

const post = await this.scope.model.post.insert({

title: 'Post001',

});

// cache

await this.scope.cacheRedis.post.set(post, post.id);

}

}

当新建数据后,将数据放入 redis 缓存中。如果这个事务出现异常,就会进行数据回滚,同时缓存数据也会回滚,从而让数据库数据与缓存数据保持一致

2. 使用指定数据源

class ServicePost {

async transactionManually() {

const db = this.bean.database.getDb({ clientName: 'default' });

await db.transaction.begin(async () => {

const modelPost = this.scope.model.post.newInstance(db);

const post = await modelPost.insert({ title: 'Post001' });

await this.scope.cacheRedis.post.set(post, post.id, { db });

});

}

}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/26 3:35:52

FT8440B输出12V350MA,18V300MA 非隔离电源方案 典型应用电路

FT8440B是离线非隔离 Buck 架构、集成 650V 高压启动与功率开关的电流模 PWM 控制器,主打高精度恒压(3%)、低成本与极简外围,适合 90–264Vac 输入、5–18V 输出、中小功率(典型 12V/450mA、18V/300mA)的恒…

作者头像 李华
网站建设 2026/4/27 1:05:16

LP3799FBC_48W隔离电源芯片(12V4A)典型应用电路

LP3799FBC&#xff08;TO220-6F&#xff0c;集成≥650V 高压管&#xff0c;原边反馈 PSR 反激&#xff09;适合 48W 级隔离 CV/CC 适配器 / 充电器&#xff0c;外围精简、EMI 友好、待机 < 75mW&#xff0c;量产与安规成本可控。典型应用场景与规格&#xff08;选型速览&…

作者头像 李华
网站建设 2026/4/27 3:25:56

在 Pr 中,3 种高效添加字幕和字幕样式的方法(剪辑师实战分享)

做视频剪辑久了你会发现&#xff0c;字幕本身并不难&#xff0c;难的是做得快、改得稳。 我自己长期用 Adobe Premiere Pro&#xff08;Pr&#xff09; 剪口播、教程和商业视频&#xff0c;踩过很多字幕的坑&#xff1a; 识别慢、断句乱、样式改一次就要返工一堆。 后来逐渐形成…

作者头像 李华
网站建设 2026/4/23 14:59:04

ArrayPool.Shared解说

NET 中频繁创建和销毁数组的情况下会导致垃圾回收器出现严重的内存压力&#xff0c;ArrayPool<T> 通过池化手段有效地降低了数组的分配和垃圾回收器的回收压力&#xff0c;同时 ArrayPool<T> 也是 MemoryPool<T> 和 PipeWriter、PipeReader 的底板。ArrayPoo…

作者头像 李华
网站建设 2026/4/25 23:29:20

VonaJS提供的读写分离,直观,优雅[特殊字符]

在VonaJS中实现读写分离&#xff0c;只需提供一组写数据源和一组读数据源。当用户访问后端 API 时&#xff0c;系统会按照规则自动选择写数据源或读数据源&#xff0c;访问相应的数据库&#xff0c;从而分摊压力&#xff0c;提升系统性能安装模块读写分离作为独立的模块提供&am…

作者头像 李华
网站建设 2026/4/21 16:04:42

鸿蒙6.0:AI与智能体框架(HMAF),重塑操作系统未来的核心密码

当用户说出“帮我规划带老人孩子的周末短途游”&#xff0c;系统便能自动整合行程、餐饮、景点资源生成完整方案&#xff1b;当驾车抵达加油站&#xff0c;车载系统自动识别油枪并完成人脸支付&#xff1b;当需要分析Excel数据&#xff0c;仅凭自然语言就能完成复杂报表生成——…

作者头像 李华