- TypeORM教程
- TypeORM - 主页
- TypeORM - 简介
- TypeORM - 安装
- TypeORM - 创建一个简单的项目
- TypeORM - 连接 API
- TypeORM - 实体
- TypeORM - 关系
- TypeORM - 使用存储库
- TypeORM - 使用实体管理器
- TypeORM - 查询生成器
- TypeORM - 查询操作
- TypeORM - 交易
- TypeORM - 索引
- TypeORM - 实体监听器和日志记录
- 使用 JavaScript 进行 TypeORM
- TypeORM - 使用 MongoDB
- 使用 Express 进行 TypeORM
- TypeORM - 迁移
- TypeORM - 使用 CLI
- TypeORM 有用资源
- TypeORM - 快速指南
- TypeORM - 有用的资源
- TypeORM - 讨论
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"; // get a connection and create a new query runner const connection = getConnection(); const queryRunner = connection.createQueryRunner(); // establish real database connection using our new query runner await queryRunner.connect(); // now we can execute any queries on a query runner, for example: await queryRunner.query("SELECT * FROM students");
现在,使用以下语句启动事务 -
await queryRunner.startTransaction();
然后,使用以下语句提交和回滚事务,
try { await queryRunner.commitTransaction(); }
如果有任何错误,则由catch()处理,
catch (err) { // since we have errors lets rollback changes we made await queryRunner.rollbackTransaction(); }
现在,释放 queryRunner,如下所示 -
finally { // you need to release query runner which is manually created: await queryRunner.release(); }