Transactions & Advanced

Preview — 3 of 10 questions

When using a QueryRunner directly to manage a transaction, which sequence is correct?

javascript
const queryRunner = dataSource.createQueryRunner();
await queryRunner.connect();
await queryRunner.startTransaction();
try {
  await queryRunner.manager.save(from);
  await queryRunner.manager.save(to);
  await queryRunner.commitTransaction();
} catch (err) {
  await queryRunner.rollbackTransaction();
  throw err;
} finally {
  await queryRunner.release();
}
Aconnect() → work → commitTransaction(); no rollback needed
BstartTransaction() → connect() → work → release() → commitTransaction()
CstartTransaction() → work → release(); commit is automatic
Dconnect() → startTransaction() → work → commitTransaction()/rollbackTransaction() → release()

Why is the standalone @Transaction()/@TransactionManager() decorator approach discouraged in modern NestJS/TypeORM code?

javascript
// Preferred: explicit transactional EntityManager
await dataSource.transaction(async (manager) => {
  await manager.save(orderEntity);
  await manager.decrement(Stock, { id: stockId }, 'quantity', 1);
});
AIt was deprecated/removed in favour of explicit dataSource.transaction() or QueryRunner, partly because decorator-injected managers don't integrate cleanly with NestJS DI and request scope
BIt cannot roll back
CIt only works with MySQL
DIt double-commits

Why use TypeOrmModule.forRootAsync() with ConfigService instead of forRoot() with a literal object?

javascript
TypeOrmModule.forRootAsync({
  inject: [ConfigService],
  useFactory: (config: ConfigService) => ({
    type: 'postgres',
    url: config.getOrThrow<string>('DATABASE_URL'),
    entities: [__dirname + '/**/*.entity{.ts,.js}'],
    synchronize: false,
  }),
});
AIt is the only way to set synchronize
BIt allows connection options to be built from injected, validated configuration (e.g. env vars) resolved at runtime
CIt opens connections lazily on first query
DIt is required for PostgreSQL

Sign up free to play

Answer all 10 questions (7 more), see explanations for every answer, and track your score.