транзакция базы данных nestjs / TypeOrm - PullRequest
0 голосов
/ 08 декабря 2018

Предполагая, что у нас есть 2 службы, A и B. Служба A имеет функцию, выполняющую следующее:

  1. Проверка данных
  2. Вызов функции службы B, которая вносит изменения вбаза данных
  3. сделать еще кое-что
  4. внести изменения в базу данных

Теперь давайте предположим, что один из следующих шагов 3 или 4 завершился неудачей.Поскольку служба B внесла изменения в базу данных, эти изменения все еще существуют.

Есть ли способ откатить базу данных в этом случае?Я думал о транзакциях с базой данных, но я не смог найти никакого способа сделать это в jest js, хотя он поддерживается TypeOrm, он не выглядит естественным для nest.Если нет, то я теперь "застрял" с изменениями, произошедшими в службе B, но без изменений должен был произойти A.

Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Доступно много решений, все они должны основываться на управлении транзакциями SQL.

Лично я считаю, что самый простой способ добиться этого - использовать один и тот же экземпляр EntityManager при выполнении кода в базе данных.,Затем вы можете использовать что-то вроде:

getConnection().transaction(entityManager -> {
    service1.doStuff1(entityManager);
    service2.doStuff2(entityManager);
});

Вы можете создать QueryRunner из экземпляра EntityManager, который будет заключен в ту же транзакцию в случае, если вы выполняете необработанный SQL вне операций ORM.Вам также необходимо порождать Repository экземпляров из EntityManager, иначе они будут выполнять код вне основной транзакции.

0 голосов
/ 16 декабря 2018

В этом случае вы должны использовать один и тот же менеджер транзакций для обеих операций с базой данных.К сожалению, у меня нет репозитория в качестве примера, но я нашел потенциальное решение с использованием Continuation Local Storage (CLS) в узле:

https://github.com/typeorm/typeorm/issues/1895

Это относится к Express.js, ноВы можете создать экземпляр TransactionManager (например, в промежуточном программном обеспечении гнезда) и сохранить его для каждого контекста запроса.После этого вы сможете повторно использовать этот диспетчер транзакций при вызовах методов службы, если они аннотированы реализацией декоратора @Transaction по приведенной выше ссылке.

Если в цепочке функций нет ошибок, менеджер транзакций зафиксирует все внесенные изменения.В противном случае менеджер откатит любые изменения.

Надеюсь, это поможет!

...