Node生态中哪一种数据库事务处理机制堪称最优雅?

摘要:Vona ORM 对数据库事务提供了完整的支持,提供了直观、优雅、强大的特性:1. 使用装饰器启用事务;2. 事务传播机制;3. 事务补偿机制;4. 确保数据库与缓存数据一致性
Vona ORM 对数据库事务提供了完整的支持,提供了直观、优雅、强大的特性: 使用装饰器启用事务 事务传播机制 事务补偿机制 确保数据库与缓存数据一致性 使用装饰器启用事务 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 以非事务方式运行。
阅读全文