Aller au contenu
Filtrer les règles par style d’implémentation
Style
Les deux styles
Sévérité
majeure
S’applique à
  • Use cases (application)
  • Adapters driven

PER-08 · Une transaction ne fait aucun appel distant et reste courte ​

Style
Les deux styles
Sévérité
majeure
S’applique à
  • Use cases (application)
  • Adapters driven

Signal ​

  • Un appel à un fournisseur de taux de change à l’intérieur de unitOfWork.run.
  • Un e-mail envoyé dans la transaction.
  • Une seule transaction qui parcourt tous les wallets pour prélever des frais mensuels.

Pourquoi ​

Une transaction garde une connexion du pool, et les verrous des lignes qu’elle a écrites, jusqu’à sa fin. Un appel distant à l’intérieur les garde aussi longtemps que le partenaire met à répondre : quand le partenaire ralentit, le pool s’épuise et toute l’application s’arrête, y compris les requêtes qui ne l’appellent jamais.

Un appel distant ne s’annule pas non plus. L’e-mail part, puis la transaction échoue : le titulaire apprend un dépôt qui n’existe pas.

Exceptions ​

Aucune.

Correction ​

  • Ce dont la transaction a besoin à l’extérieur se lit avant qu’elle ne commence : le taux, puis la transaction.
  • Ce qui doit se passer après passe par l’outbox, dans la même transaction, et part une fois le commit fait (MSG-01).
  • Un traitement par lot se découpe en une transaction par aggregate (AGG-06), et reprend là où il s’est arrêté.
ts
const rate = await this.#rates.current(command.from, command.to);

return this.#unitOfWork.run(async () => {
	const wallet = await this.#wallets.get(walletId);

	// convert with the rate fetched above, then let the wallet decide
});

Voir aussi ​

REP-13 laisse le use case ouvrir la transaction. PRC-01 traite un appel distant comme distant.