TypeORM 事务未按预期工作

时间:2021-07-11 01:52:29

标签: nestjs typeorm node.js-typeorm

我有一个场景,我需要先保存一条记录,然后在成功保存记录后再创建几个表。但我不希望这些事情孤立地发生。我的意思是,如果表创建中存在一些问题,我希望已保存的记录回滚,同样,如果在保存记录时存在一些问题,我不想继续创建表。为此,我使用了 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 数据库。

0 个答案:

没有答案