TypeORM - 事务

一般来说,事务是负责执行数据检索和更新的逻辑单元。本节详细介绍了事务。

创建事务

我们可以使用连接或EntityManage创建事务。下面的示例用于指定创建连接并在其中保存数据。

import {getConnection} from "typeorm";
await getConnection().transaction(async transactionalEntityManager => {
    await connection.manager.save(students);
});

EntityManager如下所示 −

import {getManager} from "typeorm";

await getManager().transaction(async transactionalEntityManager => {
    await transactionalEntityManager.save(students);
});

装饰器

TypeORM 中有三种与事务相关的装饰器。

  • @Transaction - 将所有执行包装在单个数据库事务中。
  • @TransactionManager - 用于在事务内执行查询。它定义如下,
@Transaction({isolation: "SERIALIZABLE"})

save(@TransactionManager() manager: EntityManager, student: Student) {
    return manager.save(student);
}

这里,

我们对事务使用了SERIALIZABLE隔离级别。

  • @TransactionRepository - 用于在存储库中注入事务。其定义如下,
@Transaction() save(student: Student, @TransactionRepository(Student) studentRepository: 
Repository<Student>) { 
   return studentRepository.save(student); 
}

QueryRunner 中的事务

QueryRunner 用于执行所有数据库查询。它具有单个数据库连接。可以使用 QueryRunner 组织数据库事务。让我们使用 QueryRunner 执行单个事务。

import {getConnection} from "typeorm";

// 获取连接并创建新的查询运行器
const connection = getConnection(); const queryRunner = connection.createQueryRunner();

// 使用我们的新查询运行器建立真正的数据库连接
await queryRunner.connect();

// 现在我们可以在查询运行器上执行任何查询,例如:await queryRunner.query("SELECT * FROM students");

现在,使用以下语句启动事务 −

await queryRunner.startTransaction();

然后,使用以下语句提交并回滚事务,

try {
    await queryRunner.commitTransaction();
}

如果有任何错误,则由 catch() 处理,

catch (err) {

    // 由于我们有错误,让我们回滚我们所做的更改 await queryRunner.rollbackTransaction();
}

现在,按以下方式释放 queryRunner −

finally {

    // 您需要释放手动创建的查询运行器: await queryRunner.release();
}