带有查询构建器的 TypeORM 事务 [英] TypeORM transaction with query builder
问题描述
我对 TypeORM
交易有一些疑问.所以我的代码如下:
I have some question with TypeORM
transaction.
So my code is like below:
public createOrderTransaction = async (
data: CreateOrderInputDTO,
): Promise<Order> => {
const queryRunner = this.connection.createQueryRunner();
await queryRunner.startTransaction();
try {
const order = await this.createOrder(data);
await this.createOrderRecord(order.id, data);
await queryRunner.commitTransaction();
return order;
} catch (error) {
this.logger.error(
"Transaction Error: 'createOrderTransaction' is failed: ",
error,
);
if (queryRunner.isTransactionActive) {
await queryRunner.rollbackTransaction();
}
}
};
还有一个像 createOrder
这样的函数使用查询构建器:
And one function like createOrder
use query builder:
private createOrder = async (data: CreateOrderInputDTO): Promise<Order> => {
const { identifiers } = await this.orderRepository
.createQueryBuilder('order')
.insert()
.into(Order)
.values([data])
.execute();
await this.saveOrderDetail(identifiers[0].id, data.orderDetails);
await this.orderRepository
.createQueryBuilder('order')
.relation(Order, 'orderDetails')
.of(identifiers[0].id)
.add(data.orderDetails);
return this.getOrder(identifiers[0].id);
};
但是当我尝试它时,如果它触发了一些逻辑错误,回滚不起作用.在我看来,query builder
似乎不支持事务.那么有没有什么方法可以将 quert builder
与 transaction
一起使用?
But when I try it, and if it fire some error middle of logic, rollback doesn't work.
The way I see it, It seem that query builder
doesn't support transaction.
So Is there any way to use quert builder
with transaction
?
推荐答案
Self Answer...在我查看 TypeORM index.d.ts
之后,我认为 createQueryBuilder
中有一些名为 queryRunner
的参数.如果你在那里输入你自己的交易查询运行器,你可以使用 queryBuilder
和 queryRunner
Self Answer...
After I am looking into TypeORM index.d.ts
, I take it that there are some parameter in createQueryBuilder
named queryRunner
so. If you input there your own query runner for transaction you can use queryBuilder
with queryRunner
就像:
public createOrderTransaction = async (
data: CreateOrderInputDTO,
): Promise<Order> => {
const queryRunner = this.connection.createQueryRunner();
await queryRunner.connect();
await queryRunner.startTransaction();
try {
const order = await this.createOrder(data, queryRunner);
await this.createOrderRecord(order.id, data, queryRunner);
await queryRunner.commitTransaction();
return order;
} catch (error) {
this.logger.error(
"Transaction Error: 'createOrderTransaction' is failed: ",
error,
);
if (queryRunner.isTransactionActive) {
await queryRunner.rollbackTransaction();
}
}
};
createOrder
就像这样:
private createOrderRecord = async (
orderId: string,
data: CreateOrderInputDTO,
queryRunner?: QueryRunner,
): Promise<void> => {
await this.orderRecordRepository
.createQueryBuilder('order_record', queryRunner)
.insert()
.into(OrderRecord)
.values([
{
...data,
orderId,
createdAt: new Date(),
},
])
.execute();
await this.orderRecordRepository
.createQueryBuilder('order_record', queryRunner)
.relation(OrderRecord, 'orderDetails')
.of(orderId)
.add(data.orderDetails);
};
这篇关于带有查询构建器的 TypeORM 事务的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!