数据库事务功能丰富多样,你都用过哪些?
摘要:Vona ORM 对数据库事务提供了完整的支持,提供了直观、优雅、强大的特性:事务传播机制、事务补偿机制、确保数据库与缓存数据一致性
Vona 是一款直观、优雅、强大的 Node.js Web 框架,用于快速开发任何规模的企业级应用。首创 DTO 动态推断与生成能力,从而显著提升开发效率和开发体验。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
创建一个新的事务。如果当前存在事务, 则把当前事务挂起。
