Bonjour j'ai trouvé un problème lorsque j'utilise ASP.NET MVC avec EF et appelez Web API d'un autre site Web (qui utilise également l'entité framework) Le problème est que
je veux m'assurer que les SAVECANGES MVC Voici My Dream Pseudo Code P> () CODE> et Web API
SAVECHANGES () CODE> réussissent à la fois ensemble. P>
public ActionResult Operation()
{
Code Insert Update Delete....
bool testMvcSaveSuccess = db.TempSaveChanges(); //it does not have this command.
if(testMvcSaveSuccess == true)
{
bool isApiSuccess = CallApi(); //insert data to Other Web App
if(isApiSuccess == true)
{
db.SaveChanges(); //Real Save
}
}
}
4 Réponses :
Oui, vous pouvez. P>
Vous devez surcharger le ou Créez votre propre .Savechanges code> dans la classe de contexte où il s'appellera d'abord vérifié, puis appelez le régulier après. p>
Tempsavechanges () code> dans la classe de contexte appelez-le alors si un appel réussi
SAVECHANGES code> de it. p>
Donc, il n'y a rien de tel que transaction est une indisposable (peut être utilisée dans un bloc à l'aide de bloc) et a des méthodes telles que commit em> et Rollback em>. P> petit exemple: p> J'ai extrait cet exemple de mon github exercice.entityframework référentiel. N'hésitez pas à étoiler / cloner / fourchette ... p> p> Tempsavechanges code> car il y a quelque chose encore mieux: Transactions strong>.
Donc, si changecount> 0, il serait sûr de 100% que transaction.commit () ne manquera pas correctement?
Jusqu'à présent, je sais: Savechanged met actuellement à jour votre base de données de manière «verrouillée» (puisque nous sommes dans une transaction). Cela signifie que tout sera le succès ou rien ne sera changé. L'appel commettez code> quittera cet état verrouillé.
Rollback code> annulera tous les changements et quittera l'état de verrouillage. Notez que cette exécution de transaction dépend de la technologie de stockage que vous utilisez actuellement. Pour plus d'informations, vous pouvez vérifier Transactions SQL ou démarrez le profileur SQL et vérifiez toutes les requêtes
Ce que vous faites référence est appelé atomicité forte>: vous voulez que plusieurs opérations réussissent tous, soit aucun d'entre eux. Dans le contexte d'une base de données, vous obtenez cette via Fondamentalement, vous devez être capable de récupérer gracieusement d'une butée soudaine à tout moment pendant la séquence. Chacune des bases de données que vous utilisez est probablement exemple de processus de processus: p>
récupération: p>
Maintenant, comme vous pouvez le constater, il est rapidement compliqué, spécialement si "déterminer si des modifications ont été apportées" est une opération non triviale. Quelle est une solution commune à cela consiste à utiliser cet identifiant de transaction unique comme moyen de déterminer quelles données ont besoin d'attention. Mais à ce stade, il devient très spécifique à la demande et dépend entièrement de quelles sont les opérations spécifiques. Pour certaines applications, vous pouvez simplement réexécuter la totalité de l'opération (puisque vous disposez des données complètes de la demande stockées dans la transaction) dans l'étape de récupération. Certains cas particuliers n'ont pas besoin de persister la transaction car il existe d'autres moyens d'atteindre les mêmes choses, etc. p>
OK, clarifions un peu les choses. P>
Vous avez une application MVC Vous voulez du code dans A1 STRUT>, qui fait une tempête de Temp sauvey dans d1 fort>, déclenche ensuite un appel à A2 fort> et si la réponse est réussie Ensuite, il enregistre les données temporaires de Basé sur votre pseudo-code, je vous suggère de créer une deuxième table dans laquelle vous enregistrez vos données "temporaires" dans d1 strong>. Donc, votre base de données a une table supplémentaire et le flux est comme celui-ci: P>
Tout d'abord, vous enregistrez vos données scénarios à considérer: p>
Sauvegarde des données temporaires dans L'appel à Il existe d'autres moyens de gérer les scénarios comme celui-ci. Vous pouvez utiliser un système de file d'attente pour gérer cela. Chaque ligne de données devient un message, vous attribuez une carte d'identité unique, un GUID, qui est essentiellement un corrélationid et c'est la même chose dans les deux systèmes. Même si un système tombe en panne, lors de la sauvegarde, les données seront sauvegardées et toutes sont bonnes dans le monde et à cause de l'ID commun, vous pouvez toujours le lier correctement. P>
Alors pourquoi pas Callapi d'abord, après cela, les savechanges MVC basées sur le succès de l'API ou non?
@ BEBEBEIZHU: Appelez le premier succès API, mais vous êtes-vous sûr que MVC SAVECHANGANGE () sera le succès? MVC peut sauvegarder l'échec
Donc, vous voulez deux opérations dans une transaction..Data Le problème de la cohérence se produit également dans le microservice, désolé je ne suis pas familier avec cette partie.