SqlException: Impasse
J'ai ces deux exceptions générées lorsque j'essaie de récupérer les données de la base de données SQL en C#:
Système.Les données.SqlClient.SqlException: Transaction (ID de Processus 97) a été bloquée sur les ressources par un autre processus et a été choisie comme victime.
OU
Système.Les données.SqlClient.SqlException: Transaction (ID de Processus 62) a été bloquée sur les ressources par un autre processus et a été choisie comme victime.
OU
Système.Les données.SqlClient.SqlException: Transaction (ID de Processus 54) a été bloquée sur les ressources par un autre processus et a été choisie comme victime. Exécutez à nouveau l'opération.
c'est le code:
using (SqlConnection con = new SqlConnection(datasource))
{
SqlCommand cmd = new SqlCommand("Select * from MyTable Where ID='1' ", con);
cmd.CommandTimeout = 300;
con.Open();
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
adapter.Fill(ds);
con.Close();
return ds.Tables[0];
}
Cela s'est passé à chaque fois.
Toutes les idées sur la façon de résoudre ces problèmes?
Pourriez-vous montrer votre requête?
Il doit y avoir d'autres requêtes s'exécutent en même temps, c'est pourquoi il blocages. Deux ou plusieurs requêtes veulent avoir accès aux mêmes données. Nous avons besoin de voir toutes les requêtes qui sont en cours d'exécution, et pas seulement celle qui devient la victime.
Vous ne pouvez pas obtenir un blocage à partir d'une requête comme ça. Il nécessite un verrou en lecture sur 1 ligne 1 table. Même si un autre processus a le verrou, il aurait attendu heureux jusqu'à ce que la demande dépassé. Pour obtenir une impasse, généralement de Fabrication1 a verrouillage A et est en attente de verrouillage B; tandis que Process2 a verrouillage B et est en attente de verrouillage A. Il doit y avoir quelques autres requêtes concernées. Exécutez le générateur de profils Sql Server (msdn.microsoft.com/en-us/library/ms187929.aspx) et de surveiller ce que les requêtes sont en cours d'exécution sur votre base de données.
Plus de Profiler et de l'impasse l'analyse des liens: (1) support.microsoft.com/default.aspx?scid=kb;en-us;832524 (2) msdn.microsoft.com/en-us/library/ms188246.aspx (3) msdn.microsoft.com/en-us/library/ms190465.aspx
OriginalL'auteur Harold SOTA | 2010-11-30
Vous devez vous connecter pour publier un commentaire.
Pas que cela va aider à l'impasse de la question, mais vous devez disposer de vos autres
IDisposable
objets bien comme tu es disposer de vosSqlConnection
en tant que tel:Vous pourriez être en mesure d'éviter la serrure avec un indicateur de verrou dans votre requête ainsi:
Espère que cette aide.
OriginalL'auteur Jesse C. Slicer
Il ya un couple de choses que vous pouvez faire pour diminuer le nombre de blocages que vous recevez, et certaines choses que vous pouvez faire pour l'éliminer complètement.
Tout d'abord, le lancement de SQL Server Profiler et dites-lui de vous donner un graphique de blocage. L'exécution de cette trace vais vous raconter l' autres requête qui est en conflit avec les vôtres. Votre question est assez simple, bien que je doute sérieusement que vous avez un
SELECT *
requête off une table Matable dans votre système...De toute façon, armé avec le graphique du blocage et de l'autre requête, vous devriez être en mesure de dire quelles sont les ressources de l'interblocage. La solution classique consiste à changer l'ordre des deux requêtes telles que les ressources sont accessibles dans le même ordre -- cela évite les cycles.
D'autres choses que vous pouvez faire:
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
dans vos transactions, le cas échéant. Également activer lire commis avec des rangées de gestion des versions. Dans de nombreux cas, ce est assez pour éliminer la plupart des blocages complètement. Lire sur les niveaux d'isolation des transactions. Comprendre ce que vous faites.OriginalL'auteur Dave Markle
En gros, le serveur SQL de simultanéité modèle de sorte que vous pouvez ne jamais éviter cette exception (par exemple. complètement indépendant de la transaction pourraient bloquer eachother si elles se verrouiller la même page d'index ou de quelque chose). Le meilleur que vous pouvez faire est de garder vos transactions à court afin de réduire la probabilité, et si vous obtenez l'exception, de faire ce qu'il dit et recommencez l'opération.
Non, je ne suis pas. Si vous utilisez la valeur par défaut de verrouillage (parfois rowlock, parfois pagelock), il est facile de voir que deux indépendants des transactions pourrait accidentellement impasse eachother (au moins si elles sont mises à jour deux tables à l'intérieur de la transaction et que vous n'utilisez pas de conseils pour s'assurer que les tableaux sont toujours lire dans le même ordre). Pour le verrou cas, c'est moins évident, mais les indices peuvent vous mordre ici.
OriginalL'auteur erikkallen