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

news/2025/9/30 10:17:13/文章来源:https://www.cnblogs.com/zhennann/p/19120080

Vona ORM 对数据库事务提供了完整的支持,提供了直观、优雅、强大的特性:

  1. 使用装饰器启用事务
  2. 事务传播机制
  3. 事务补偿机制
  4. 确保数据库与缓存数据一致性

使用装饰器启用事务

import { Database } from 'vona-module-a-orm';class ServicePost {@Database.transaction()async transaction() {// insertconst post = await this.scope.model.post.insert({title: 'Post001',});// updateawait 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() {// insertconst post = await this.scope.model.post.insert({title: 'Post001',});// cacheawait 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 });});}
}  
  • 如果对指定的数据库进行操作,那么就需要将数据库对象db传入缓存,从而让缓存针对数据库对象db执行相应的补偿操作。当数据库事务回滚时,让数据库数据与缓存数据保持一致

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/922691.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详细介绍:扒透 STL 底层!map/set 如何封装红黑树?迭代器逻辑 + 键值限制全手撕----《Hello C++ Wrold!》(23)--(C/C++)

详细介绍:扒透 STL 底层!map/set 如何封装红黑树?迭代器逻辑 + 键值限制全手撕----《Hello C++ Wrold!》(23)--(C/C++)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !impor…

死锁的处理策略-预防死锁

破坏互斥条件 对于必须互斥使用资源的争抢才会导致死锁 如果吧互斥使用的资源改为允许共享使用,则系统不会进入死锁状态 比如SPOOLing技术: 就以打印机为例子,假如进程1和进程2都申请使用打印机,SPOOLing会在两个进…

跨网文件安全交换系统:提升数据传输安全性和合规性

跨网文件安全交换系统是现代企业管理中不可或缺的一部分,特别是Ftrans Ferry跨网文件安全交换系统和内外网文件摆渡系统,正好契合了对敏感信息保护需求日益增长的趋势。这些系统通过先进的加密技术和严格的身份验证,…

企业网站注册域名的步骤网站建设培训价格

效果: 1.编译FFmpeg库: 下载FFmpeg-kit的源码并编译生成安装平台库 2.复制生成的FFmpeg库so文件与包含目录到自己的Android下 如果没有prebuiltLibs目录,创建一个,然后复制 包含目录只复制arm64-v8a下

swoole怎么做直播网站wordpress文章不显示图片

2345浏览器安装完成之后默认将2345导航设为主页,但是很多用户其实不习惯用2345导航,那2345浏览器怎么换主页呢?今天小编就教一个方法。 2345浏览器换主页教程 1、首先打开2345浏览器,找到在网站页面的“工具”在浏览器的右上角&#xff0c…

ArcGIS 公众号推荐

ArcGIS 公众号推荐Arcigs带你飞 地学大数据 GIS前沿 小猿猴GISer

跨网文件交换系统:数字化时代企业与机构的数据安全传输利器

如今,随着数字化进程全面提速,任何组织的“生命线”都系在数据能否顺畅流动上。为了守住安全底线,网络隔离已成标配——研发网、办公网、生产网被企业层层切分,医院、政府的内网与外网更是泾渭分明。可越是“隔离”…

软件开发定制app网站首页关键如何优化

作者:饶子昊、杨龙 应用复杂度提升,根因定位困难重重 随着软件技术发展迭代,很多企业软件系统也逐步从单体应用向云原生微服务架构演进,一方面让应用实现高并发、易扩展、开发敏捷度高等效果,但另外一方面也让软件应…

期货市场API对接完全指南:实时行情获取与实战应用

期货市场API对接完全指南:实时行情获取与实战应用本文详细介绍了如何通过API接口获取全球期货市场的实时行情数据,包含完整的代码示例、数据处理方法和实战应用场景。一、期货API概述 期货市场是金融市场的重要组成部…

AT_agc037_c [AGC037C] Numbers on a Circle

你倒着考虑,有一个结论是:如果一个 \(b\) 可以操作,它一定会操作到不能操作为止,然后换别的数操作。这样我们可以维护当前 \(b\) 的最大值,每次操作 \(b\) 至少减半,于是时间复杂度做到了 \(O(n \log n \log V)\…

记账本|基于SSM的家庭记账本小程序设计与实现(源码+数据库+文档) - 实践

记账本|基于SSM的家庭记账本小程序设计与实现(源码+数据库+文档) - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: …

爱名网做网站教程制作网线

深度睡眠(C3)和深度睡眠(C4)是用于描述移动平台电源管理的术语。电源管理就是通过将 CPU 置于不使用状态时休眠来延长电池续航时间。C3 深度睡眠和 C4 深度睡眠是 ACPI 电源管理状态。更深的睡眠源自 CPU 和芯片组交互的改进,以重定向 snoop 周期。CPU 的深度 C4 状…

网站建设免费空间注册导航公司名称可以和网站域名不同吗

文章目录 环境配置靶场介绍靶场设置 外网渗透信息收集端口扫描目录扫描 漏洞发现与利用获取ssh账号密码,登录centos 提权 内网渗透建立代理内网信息收集smb暴破,获取本地管理员密码 横向移动使用psexec模块上线msf 环境配置 靶场介绍 靶场地址 http:/…

做网站行业零代码开发平台

最近在看《设计模式与游戏完美开发》,文章将记录一些要点和一些设计模式实现 GoF定义的23种设计模式及应用场景 系统设计可以采用的设计模式:单例、状态(场景切换)、外观(保证高内聚)、中介者&#xff08…

缩放 div

缩放 div<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0&q…

Redis从零讲解 - 详解

Redis从零讲解 - 详解2025-09-30 09:50 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-…

如何建设社区网站野花韩国视频在线观看免费高清

知识图谱&#xff1a;浙江大学教授 陈华军 知识图谱 1课时 http://openkg.cn/datasets-type/ 知识图谱的价值 知识图谱是有什么用&#xff1f; 语义搜索 问答系统 QA问答对知识图谱&#xff1a;结构化图 辅助推荐系统 大数据分析系统 自然语言理解 辅助视觉理解 例…

房地产行业网站开发网页界面设计公司

文章目录一、环境分布二、实战1. kafka下载2. 解压3. 配置4. 编写启动脚本5. 编写关闭脚本6. 赋予脚本可执行权限7. 脚本使用案例一、环境分布 软件版本jdk1.8kafkakafka_2.13-2.5.0 二、实战 kafka官网地址&#xff1a; http://kafka.apache.org/downloads 1. kafka下载 …

【2025-09-29】团队合作

20:00没有了家庭,在广大的宇宙间,人会冷得发抖。——安德烈莫罗阿今早比平时提前了15分钟出门送大宝上学。因为公司内部有个产品宣讲会议,时间定在9点半,刚好是我平时上班回到公司的时间。考虑到参会人员都是公司领…

淘宝客api网站架设教程建设公司门户网站

文章目录 一、单选题1、三次握手、四次挥手发生在网络模型的哪一层上&#xff1f;2、互联网Internet的拓扑结构是什么&#xff1f;3、以下哪一种网络设备是工作在网络层的&#xff1f;4、以下哪种关于分组交换网络的说法是错误的&#xff1f;5、以下哪种协议是在TCP/IP模型中的…