Как применить транзакции к TypeORM при использовании его в режиме activerecord? - PullRequest
2 голосов
/ 17 июня 2020

Я использую TypeORM в режиме активной записи, и я хотел применить транзакции. В частности, я хотел, чтобы каждый из моих тестов был заключен в транзакцию, поэтому, достигнув чего-то вроде этого:

beforeEach(async () => {
  // start transaction
})

afterEach(async () => {
  // rollback transacttion
})

test("create new", async () => {
  // create new
}

Итак, я попробовал это:

let queryRunner: any

beforeEach(async () => {
  queryRunner = getConnection().createQueryRunner()
  await queryRunner.connect()
  await queryRunner.startTransaction()
})

afterEach(async () => {
  await queryRunner.rollbackTransaction()
  await queryRunner.release()
})

test("Create user", async () => {
  let user = new User()
  await user.save()
})

, но это выглядит например, эти транзакции запускаются в отдельном контексте / соединении, потому что после запуска теста я могу видеть запись в базе данных.

Как мне сделать так, чтобы транзакция повлияла на сохраняемого пользователя?

Ответы [ 2 ]

0 голосов
/ 04 июля 2020

instance.save() будет использовать другой queryRunner см. здесь , это означает, что он не использует транзакцию, которую вы начали, поэтому вы не можете откатить user.save();

Когда вы вызываете user.save() COMMIT, вы можете проверить это, установив logging: true в параметрах подключения.

Вы должны запустить save, используя queryRunner, который вы создали, таким образом вы можете откат

test("Create user", async () => {
    let user = new User()
    await queryRunner.manager.save(user);
})
0 голосов
/ 02 июля 2020

Я думаю, вам нужно подключить свой обработчик запросов к базе данных. Попробуйте изменить свой код следующим образом:

let queryRunner = getConnection().createQueryRunner()
await queryRunner.connect()
await queryRunner.startTransaction()
let user = new User()
await user.save()
await queryRunner.rollbackTransaction()
await queryRunner.release()

Также вам следует использовать блок try-catch-finally.

...