事务
事务确保一系列数据库操作要么全部成功,要么全部失败,保证数据一致性。
回调式事务(推荐)
使用 transaction() 方法,自动处理提交和回滚:
ts
import { getORM } from '@ibestservices/ibest-orm';
const orm = getORM();
orm.transaction(() => {
// 在事务中执行操作
const user = new User();
user.name = '张三';
orm.insert(user);
const order = new Order();
order.userId = user.id;
order.amount = 100;
orm.insert(order);
// 如果所有操作成功,自动提交
// 如果任何操作失败,自动回滚
});手动事务
需要更细粒度控制时,可以手动管理事务:
ts
orm.beginTransaction();
try {
const user = new User();
user.name = '张三';
orm.insert(user);
const order = new Order();
order.userId = user.id;
order.amount = 100;
orm.insert(order);
// 手动提交
orm.commit();
} catch (error) {
// 发生错误时回滚
orm.rollback();
console.error('事务失败:', error);
}嵌套事务
IBest-ORM 支持嵌套事务(通过事务深度计数实现):
ts
orm.beginTransaction(); // 深度 1
try {
orm.insert(user1);
orm.beginTransaction(); // 深度 2
try {
orm.insert(user2);
orm.commit(); // 深度变为 1
} catch (e) {
orm.rollback(); // 深度变为 1
}
orm.insert(user3);
orm.commit(); // 深度变为 0,真正提交
} catch (e) {
orm.rollback(); // 深度变为 0,真正回滚
}注意
HarmonyOS RelationalStore 不支持 SAVEPOINT,嵌套事务仅跟踪深度。内层回滚不会立即回滚,而是在最外层事务结束时统一处理。
获取事务深度
ts
const depth = orm.getTransactionDepth();
console.log('当前事务深度:', depth);事务中的错误处理
ts
orm.transaction(() => {
try {
orm.insert(user);
// 模拟错误
if (someCondition) {
throw new Error('业务逻辑错误');
}
orm.insert(order);
} catch (error) {
// 抛出错误会触发自动回滚
throw error;
}
});最佳实践
- 优先使用回调式事务:自动处理提交和回滚,减少出错可能
- 保持事务简短:长事务会锁定资源,影响并发性能
- 避免在事务中进行耗时操作:如网络请求、文件 I/O
- 正确处理异常:确保异常能够触发回滚
ts
// 推荐写法
orm.transaction(() => {
// 只包含数据库操作
orm.insert(user);
orm.insert(order);
});
// 不推荐写法
orm.transaction(() => {
orm.insert(user);
// 避免在事务中进行网络请求
// await fetch('...');
orm.insert(order);
});