0
votes

Mysql - dbupdateException ("impression trouvé lors de la tentative de serrure; essayez de redémarrer la transaction ')

J'ai une application MVC dans .NET CORE utilise MySQL. J'ai une fonction de téléchargement où ID est transmis pour télécharger un fichier. Cependant, les erreurs continuent de se produire et semblent en quelque sorte que l'application devient moins réactive sur le serveur comme s'il est recyclé. Le code suivant montre la pièce responsable du téléchargement du fichier. J'utilise des transactions pour vous assurer que le compteur de téléchargement a été mis à jour correctement. L'erreur que je reçois est liée à l'impasse. Est-il possible que quelqu'un puisse signaler où le problème est?

Exception has occurred: CLR/MySql.Data.MySqlClient.MySqlException
An exception of type 'MySql.Data.MySqlClient.MySqlException' occurred in Microsoft.EntityFrameworkCore.dll but was not handled in user code: 'Deadlock found when trying to get lock; try restarting transaction'
  at MySql.Data.MySqlClient.MySqlStream.ReadPacket()
  at MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int64& insertedId)
  at MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId, Boolean force)
  at MySql.Data.MySqlClient.MySqlDataReader.NextResult()
  at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
  at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.Execute(IRelationalConnection connection, DbCommandMethod executeMethod, IReadOnlyDictionary`2 parameterValues)
  at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteReader(IRelationalConnection connection, IReadOnlyDictionary`2 parameterValues)    
  at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.BufferlessMoveNext(DbContext _, Boolean buffer)    
  at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.MoveNext()
  at System.Linq.Enumerable.SelectEnumerableIterator`2.MoveNext()    
  at System.Linq.Enumerable.TryGetFirst[TSource](IEnumerable`1 source, Boolean& found)    
  at Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.ResultEnumerable`1.GetEnumerator()
  at Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.<_TrackEntities>d__17`2.MoveNext()
  at Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.ExceptionInterceptor`1.EnumeratorExceptionInterceptor.MoveNext()
  at System.Linq.Enumerable.TryGetFirst[TSource](IEnumerable`1 source, Boolean& found)    
  at System.Linq.Enumerable.First[TSource](IEnumerable`1 source)    
  at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.<>c__DisplayClass15_1`1.<CompileQueryCore>b__0(QueryContext qc)    
  at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable`1 source)    
  at ProjectProcess.DownloadProject(Int32 downloadId) in C:\Users\Projects\ProjectWebsite\BusinessLogic\ProjectProcess.cs:line 124    
  at ProjectController.DownloadProject(Int32 downloadID) in C:\Users\Projects\ProjectWebsite\Controllers\ProjectController.cs:line 33    
  at Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute(Object target, Object[] parameters)    
  at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeActionMethodAsync>d__12.MoveNext()


3 Réponses :


2
votes

Le problème est que vous ne bloquez pas certains enregistrements. Dans MySQL, vous pouvez verrouiller des rangées comme celle-ci xxx pré>

mais pour votre problème, vous pouvez essayer ceci. J'espère que cela résout votre problème P>

using (var scope = new TransactionScope(TransactionScopeOption.RequireNew,
new TransactionOptions { 
    IsolationLevel = IsolationLevel.ReadUncommitted 
}))
{
  // your select and increment should go here  
}


7 commentaires

Merci. Maintenant, j'obtiens une erreur différente d'une tentative de connexion échoué car la partie connectée n'a pas répondu correctement après une période de temps, ou une connexion établie a échoué car l'hôte connecté n'a pas réussi à réagir \ r \ n sur system.net.sockets.networkstream. Lire (byte [] tampon, compensation int32, int32 taille)} Message [String]: "Impossible de lire les données de la connexion de transport: une tentative de connexion a échoué car la partie connectée n'a pas répondu correctement après une période de temps ou de connexion établie échoué car l'hôte connecté n'a pas réussi à répondre. "


Une question s'il vous plaît, pourquoi ne suffit pas d'avoir un transaction par défaut?


Merci à @mjwills, je pense maintenant que je sais que Serializable est le niveau d'isolement par défaut qui est le niveau le plus sûr, mais avec une capacité minimale de concurrence. Mais de quelque manière que ce soit, pourquoi est-ce le cas de l'impasse dans ma requête?


Probablement Serializable Le niveau d'isolement est la cause de votre impasse.


Peut-être parce que vous manquez la partie de restauration enfin de la portée. Et vous lancez une exception du milieu. Couvrir tout le corps avec essayer d'ajouter enfin


Merci @talhaakber Votre solution fonctionne. Une chose, concernant l'erreur "Impossible de lire les données de la connexion de transport: une tentative de connexion a échoué car la partie connectée n'a pas répondu correctement après une période de temps ou une connexion établie a échoué car l'hôte connecté n'a pas réussi à répondre." Après avoir redémarré le service MySQL , il est parti


Mais une chose, je ne pouvais pas comprendre, c'est que l'impasse se produit dans le mode sérialisable car j'ai une seule clé, n'est-ce pas? Donc, si un fil capture la clé, la seconde doit simplement attendre que la première transaction soit terminée! Ai-je raison? ou ai-je manqué quelque chose? Ou est-ce parce que vous incluez ... Plus d'une clé? Merci



1
votes

Pouvez-vous essayer une chose de plus. Juste une solution rapide xxx


3 commentaires

merci @talhaakber. Je vais ajouter ça. Au fait, après avoir redémarré le service MySQL, tout semble bien. Je ne suis pas sûr de ce que était le porblem. Quoi qu'il en soit, je vais continuer à vérifier.


Avec l'isolationvel par défaut ou avez-vous changé de transaction? La principale raison était que vous avez démarré la transaction et que vous n'avez jamais terminé, car vous avez jeté une exception du milieu. essayez de prendre en compte enfin la balise après avoir essayé de voir et de retourner votre portée


Avec la perplexe par défaut, l'exception est lancée.



0
votes

Essayez de mettre ces avant d'utiliser la portée de la transaction : xxx


0 commentaires