【问题标题】:How to use transactions in Typeorm with typeorm-transactional-cls-hooked如何在 Typeorm 中使用带有 typeorm-transactional-cls-hooked 的事务
【发布时间】:2022-01-11 17:26:43
【问题描述】:

我不能让所有东西都在同一个事务中运行。

我有以下代码:

export class TestService {
  repository: any;
  constructor(
  @Inject(TENANT_CONNECTION) private connection)
  {
    this.repository = connection.getRepository(Test)
  }`

 @Transactional()
  async agregar(tableNew: Test): Promise<Number> {
    const tableSave = this.repository.create(tableNew)
    await this.repository.save(tableSave)
    if(tableSave.default){
      await this.repository.update(
            {default:true,id:Not(tableSave.id)},
            {default:false}
      )
    }
    return tableSave.id 
}

在数据库中执行如下:

query: START TRANSACTION
query: SELECT `Test`.`id` AS `Test_id`,`Test`.`default` AS `Test_default` FROM `test` `Test` WHERE `Test`.`id` IN (?) -- PARAMETERS: [0]
query: START TRANSACTION
query: INSERT INTO `test`(`id`,`default`) VALUES (?,?) -- PARAMETERS: [0,1]
query: COMMIT
query: UPDATE `test` SET `default` = ? WHERE (`default` = ? AND `id` != ?) -- PARAMETERS: [0,true,41]
query: COMMIT

如您所见,执行了 2 个事务,我需要它只有一个

【问题讨论】:

    标签: nestjs typeorm


    【解决方案1】:

    initializecls-hooked 命名空间是否正确?

    【讨论】:

    • 是的,这就是我在 main.ts 中的做法:import { initializeTransactionalContext, patchTypeORMRepositoryWithBaseRepository } from 'typeorm-transactional-cls-hooked'; async function bootstrap() { initializeTransactionalContext() patchTypeORMRepositoryWithBaseRepository() const app = await NestFactory.create(AppModule); app.enableCors(); app.useGlobalPipes( new ValidationPipe({ whitelist: true }) ); }
    【解决方案2】:

    如果您只想跨多个服务启动 1 个事务,则将主服务设为 @Transactional(),并将子服务的传播选项设为 @Transactional(propagation: Propagation.MANDATORY)。 MANDATORY 选项将支持主事务

    【讨论】:

      猜你喜欢
      • 2022-09-28
      • 1970-01-01
      • 2020-02-29
      • 2021-10-12
      • 1970-01-01
      • 1970-01-01
      • 2019-11-01
      • 1970-01-01
      • 2019-11-25
      相关资源
      最近更新 更多