Node生態中最優雅的數據庫事務處理機制
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 | 以非事務方式運行。如果當前存在事務,則拋出異常 |
事務補償機制
當事務成功或者失敗時執行一些邏輯
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執行相應的補償操作。當數據庫事務回滾時,讓數據庫數據與緩存數據保持一致

Vona ORM 對數據庫事務提供了完整的支持,提供了直觀、優雅、強大的特性:1. 使用裝飾器啟用事務;2. 事務傳播機制;3. 事務補償機制;4. 確保數據庫與緩存數據一致性
浙公網安備 33010602011771號