我有一个场景,我需要先保存一条记录,然后在成功保存记录后再创建几个表。但我不希望这些事情孤立地发生。我的意思是,如果表创建中存在一些问题,我希望已保存的记录回滚,同样,如果在保存记录时存在一些问题,我不想继续创建表。为此,我使用了 TypeORM 事务。
这是我迄今为止尝试过的:
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { getManager, Repository } from 'typeorm';
import { CreateTenantDto } from './dto/create-tenant.dto';
import { UpdateTenantDto } from './dto/update-tenant.dto';
import { Tenant } from './entities/tenant.entity';
@Injectable()
export class TenantService {
constructor(
@InjectRepository(Tenant)
private tenantRepo: Repository<Tenant>
) { }
async create(createTenantDto: CreateTenantDto) {
try {
const { tenant_id, tenant_name } = createTenantDto
const tenant = new Tenant()
tenant.tenant_id = tenant_id
tenant.tenant_name = tenant_name
const createdTenant = await this.createTenantSchema(tenant_id, tenant)
return {
success: true,
message: "Tenant created successfully!",
data: createdTenant
}
} catch (error) {
console.log(error);
return {
success: false,
error: "Problem in creating tenant!"
}
}
}
async createTenantSchema(tenant_id: string, tenant: Tenant): Promise<void> {
await getManager().transaction(async transactionalEntityManager => {
// Step 1: Save the record
await transactionalEntityManager.save(tenant);
// Step 2: Create first table
await transactionalEntityManager.query(`
CREATE TABLE ${tenant_id}__customer(
customer_id int primary key auto_increment,
firstname varchar(255),
middlename varchar(255),
lastname varchar(255),
address varchar(255)
)`);
// Step 3: Create second table query
await transactionalEntityManager.query(`
CREATE TABLE ${tenant_id}__product (
product_id int primary key auto_increment,
product_name varchar(255)
)`);
});
}
}
我测试的是,我犯了一些语法错误(从第二个查询中删除了 TABLE
字符串)。但不幸的是,记录被保存并创建了第一个表。我猜这不是交易的预期。我在这里错过了什么?
P.S:我使用 Nestjs 作为后端,带有 TypeORM 和 MYSQL 数据库。