2 votes

Comment empêcher le marquage involontaire d'une transaction de portée supprimée dans NServiceBus ?

J'essaie d'envoyer un simple message, mais il semble qu'il soit automatiquement signalé comme n'ayant pas la portée d'une transaction ( comportement ). Le point final utilise le transport SQL (3.0.1) et NSB 6.1.2, le transport SQL fonctionne en mode transactionnel par défaut (TransactionScope).

Pour autant que je sache, aucune action spécifique n'a été entreprise pour cela, la seule chose que je peux imaginer est que la chaîne de connexion est partagée avec Dapper qui a exécuté quelques requêtes attendues vers la base de données également.

var data = await Provider.GetSomeRandomData(message.DataId);
bool synced = false;
await context.Reply(new RandomMessage());

Si le point d'extrémité est configuré à l'aide de TransportTransactionMode.SendsAtomicWithReceive rien n'est enregistré, lorsque TransportTransactionMode.TransactionScope est activée, l'enregistrement se produit (et, bien entendu, l'effet réel est probablement perdu).

Idéalement, le fournisseur utiliserait (d'une manière ou d'une autre) la même transaction que NServiceBus, bien que pour l'interrogation des données, il devrait s'affranchir de ce contexte de transaction, interroger la base de données sans interrompre la transaction NServiceBus (si c'est réellement le problème), de sorte que les écritures soient toujours transactées.

0voto

Sean Farmar Points 1575

Pouvez-vous essayer d'ajouter .ConfigureAwait(false)

await context.Reply(new RandomMessage()) .ConfigureAwait(false);

Voir cet article pour plus de détails

Cela résout-il le problème ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X