Vona 是一款直观、优雅、强大的 Node.js Web 框架,用于快速开发任何规模的企业级应用。首创 DTO 动态推断与生成能力,从而显著提升开发效率和开发体验。Vona ORM 对数据库事务提供了完整的支持,提供了直观、优雅、强大的特性:

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

使用装饰器启用事务

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 });
});
}
}
  • 如果对指定的数据库进行操作,那么就需要将数据库对象db传入缓存,从而让缓存针对数据库对象db执行相应的补偿操作。当数据库事务回滚时,让数据库数据与缓存数据保持一致

这个Database Transaction功能多多,你用过吗?的更多相关文章

  1. Oracle Database Transaction Isolation Levels 事务隔离级别

    Overview of Oracle Database Transaction Isolation Levels Oracle 数据库提供如下事务隔离级别: 已提交读隔离级别 可串行化隔离级别 只读隔 ...

  2. code first System.Data.Entity.Infrastructure.CommitFailedException: An error was reported while committing a database transaction but it could not be determined whether the transaction succeeded

    System.Data.Entity.Infrastructure.CommitFailedException: An error was reported while committing a da ...

  3. 数据库事务(Database Transaction)概述

    事务概念 事务可以用很多很多不同的方式去定义.事务是数据库操作执行的一个逻辑工作单元,是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位.例如, 在关系数据库中, 一 ...

  4. 数据库事务(Database Transaction)

    事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit).事务由事务开始(begin transaction)和事务结束(commit transaction或 ...

  5. linux中tr的功能多多

    功能 通过使用 tr,您可以非常容易地实现 sed 的许多最基本功能. 您可以将 tr 看作为 sed 的(极其)简化的变体:它可以用一个字符来替换另一个字符,或者可以完全除去一些字符.您也可以用它来 ...

  6. MySQL Database on Azure新功能

    本月中国版的MySQL Database on Azure发布了两项新功能: 1.主从复制——只读实例 在这之前Azure上的MySQL数据库也是支持主从复制的,但是只能作为on-premises部署 ...

  7. html 5 本地数据库(Web Sql Database)核心方法openDatabase、transaction、executeSql 详解

    Web SQL数据库API实际上不是HTML5规范的组成部分,而是单独的规范.它通过一套API来操纵客户端的数据库.Safari.Chrome. Firefox.Opera等主流浏览器都已经支持Web ...

  8. OLTP(on-line transaction processing)与OLAP(On-Line Analytical Processing)

    OLTP与OLAP的介绍 数据处理大致可以分成两大类:联机事务处理OLTP(on-line transaction processing).联机分析处理OLAP(On-Line Analytical ...

  9. HTML5开发学习:本地存储Web Sql Database

       Web Sql Database,中文翻译作"本地数据库",是随着HTML5规范加入的在浏览器端运行的轻量级数据库.    在HTML5中,大大丰富了客户端本地可以存储的内容 ...

  10. 前端存储之Web Sql Database

    前言 在上一篇前端存储之indexedDB中说到,我们项目组要搞一个前后端分离的项目,要求在前端实现存储,我们首先找到了indexedDB,而我们研究了一段时间的indexedDB后,发现它并不是很适 ...

随机推荐

  1. 在java中动态执行js代码

    说明 在jdk11就标注了要取消NashornScriptEngineFactory类,在jdk17正式移除,所以在17上得加入pom依赖 <dependency> <groupId ...

  2. JuiceFS介绍

    简单介绍 JuiceFS 是一款面向云原生设计的高性能分布式文件系统,在 Apache 2.0 开源协议下发布.提供完备的 POSIX 兼容性,可将几乎所有对象存储接入本地作为海量本地磁盘使用,亦可同 ...

  3. LeetCode 914卡盘分组

    看了官方题解如下: class Solution { public boolean hasGroupsSizeX(int[] deck) { int N = deck.length; int[] co ...

  4. Element-Plus官网Header类像素效果的实现

      Element-Plus官网Header类像素效果 一.前言 在使用Element-Plus时,发现有两个很有趣的效果,一个是header的背景模糊效果,另一个是黑夜模式切换动画,在此我们先来研究 ...

  5. Model Context Protocol C# SDK v0.3.0-preview.1 版本发布

    Model Context Protocol (MCP) 是一种新兴的开放标准,旨在实现大型语言模型(LLM)与外部数据源及工具之间的无缝集成.v0.3.0-preview.1 版本是这一标准的重要更 ...

  6. HyperWorks中的Size and bias 子面板

    此面板是 automesh 经常使用的子面板,通过此面板,用户可用设置单元尺寸.单元类型以及以及映射类型等多种控制选项,然后通过预览按钮查看待生成网格模型的状态.   图 3-6 size and b ...

  7. 将本地的jar包加到maven中,pom添加依赖

    开发过程中经常遇到需要用某些http://maven.apache.org/中没有的jar包,这个时候可以用maven命令自己添加 通常这些jar包可以从其官网下载下来,然后用maven明天添加此ja ...

  8. centos7导入很大的数据库脚本

    前提因为远程桌面,图形化界面实在是太慢了 所以将压缩数据库文件传入到服务器某个目录下aggs_court.sql.gz解压gunzip aggs_court.sql.gz进入数据库:mysql -p@ ...

  9. 前端开发系列052-基础篇之数据流和组件通信(Vue)

    本文是早期学习Vue整理的一些阶段性总结,内容主要关于Vue框架中组件间通信和数据流. 一.组件中的数据 Vue组件中的数据主要有两种,一种是组件内部提供的,一种是组件外部传入的. 组件内部提供的数据 ...

  10. LNK1107 文件无效或损坏: 无法在 0x308 处读取 解决方案

    LNK1107 文件无效或损坏: 无法在 0x308 处读取 解决方案 环境:windows 需要的库 freeglut.dll 使用cmake编译的时候,有一个选项,选择编译器,如果你编译的是一个3 ...