Транзакции типа ORM работают не так, как ожидалось

#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.