news 2026/7/10 5:23:50

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/7/10 8:44:35

桥梁与隧道安全守护者 抗冰冻型风速监测方案

强风是威胁大型桥梁、高山隧道口安全运营的重要自然因素。实时、准确的风速风向监测是发布预警、采取限行措施的科学依据。FST200-207抗冰冻型超声波风速风向传感器专为此类基础设施的安全监测而设计。 桥梁,特别是悬索桥和斜拉桥,对风荷载非常敏感。在…

作者头像 李华
网站建设 2026/7/10 9:51:19

05-FreeRTOS的内存管理

概述在 FreeRTOS 中,内存管理是连接内核功能与硬件资源的核心环节,直接影响系统的实时性、稳定性和资源利用率。对于基于 STM32 的开发,理解 FreeRTOS 的 内存管理方案是实现可靠嵌入式系统的基础。一、为什么要学习 FreeRTOS 内存管理&#…

作者头像 李华
网站建设 2026/7/9 8:58:04

基于大数据的人脸识别系统设计与实现开题报告

选题意义随着科技的发展,人脸识别技术被广泛应用在门禁、支付、身份验证等领域,极大地提高了效率并增强了安全性。它能减少传统密码式的繁琐,让人们的生活更便捷。这是数字化转型的一部分,有助于构建智慧城市和物联网环境下的智能…

作者头像 李华
网站建设 2026/7/8 15:57:11

车载 Android 系统稳定性问题全解析:从性能到黑屏的排查指南

引言 在车载 Android 系统开发中,稳定性问题是最让人头疼的挑战之一。与手机不同,车载系统对稳定性的要求近乎苛刻——想象一下,用户正在高速公路上行驶,导航突然黑屏,或者中控卡死无响应,这不仅仅是用户体验问题,更关乎行车安全。 经过多年的车载系统开发实践,我们将…

作者头像 李华
网站建设 2026/7/9 5:10:02

气象在线监测系统助力智慧环境管理,金叶仪器专业气象监测解决方案

在当今社会,气象环境数据对于生产生活、科学研究与可持续发展具有日益重要的意义。准确、连续的气象监测不仅能够帮助人们更好地理解自然环境变化,也为农业、交通、能源、环保等多个领域提供了关键的数据支撑。随着物联网、云计算等技术的成熟&#xff0…

作者头像 李华