Skip to content

事务

事务确保一系列数据库操作要么全部成功,要么全部失败,保证数据一致性。

回调式事务(推荐)

使用 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;
  }
});

最佳实践

  1. 优先使用回调式事务:自动处理提交和回滚,减少出错可能
  2. 保持事务简短:长事务会锁定资源,影响并发性能
  3. 避免在事务中进行耗时操作:如网络请求、文件 I/O
  4. 正确处理异常:确保异常能够触发回滚
ts
// 推荐写法
orm.transaction(() => {
  // 只包含数据库操作
  orm.insert(user);
  orm.insert(order);
});

// 不推荐写法
orm.transaction(() => {
  orm.insert(user);
  // 避免在事务中进行网络请求
  // await fetch('...');
  orm.insert(order);
});