1 votes

SQL Compact Edition 3.5 SP 1 - LockTimeOutException - comment déboguer ?

Par intermittence dans notre application, nous rencontrons des LockTimeoutExceptions lancées par SQL CE. Nous avons récemment effectué une mise à niveau vers la version 3.5 SP 1, et un certain nombre d'entre elles semblent avoir disparu, mais nous les voyons encore occasionnellement. Je suis certain qu'il s'agit d'un bogue dans notre code (qui est multithread), mais je n'ai pas été en mesure de le localiser précisément. Quelqu'un a-t-il de bonnes techniques pour déboguer ce problème ? Les exceptions s'affichent comme suit (il n'y a jamais de trace de pile pour ces exceptions) :

SQL Server Compact a dépassé le délai d'attente d'un verrou. Le délai de verrouillage par défaut est de 2000 ms pour les périphériques et 5000 ms pour les ordinateurs de bureau. Le délai de verrouillage par défaut peut être augmenté dans la chaîne de connexion à l'aide de la propriété ssce : default lock timeout. [ Session id = 6,Thread id = 7856,Process id = 10116,Table name = Product,Conflict type = s lock (x blocks),Resource = DDL ]

Notre base de données est très sollicitée en lecture, mais fait rarement des écritures, et je piense en J'ai tout protégé là où il faut.

EDIT : SQL CE utilise déjà automatiquement NOLOCK http://msdn.microsoft.com/en-us/library/ms172398(sql.90).aspx

1voto

Bob King Points 12913

Je viens de me rendre compte que la version 3.5 SP1 contient de nouvelles informations dans l'exception qui m'ont permis de la localiser.

SQL Server Compact a dépassé le délai d'attente d'un verrou. Le délai de verrouillage par défaut est de 2000 ms pour les périphériques et 5000 ms pour les ordinateurs de bureau. Le délai de verrouillage par défaut peut être augmenté dans la chaîne de connexion à l'aide de la propriété ssce : default lock timeout. [ Session id = 6,Thread id = 7856,Process id = 10116, Nom de la table = Produit ,Type de conflit = s lock (x blocs), Ressource = DDL ]

J'ai pu identifier que cela se produisait lorsque l'on essayait de supprimer une table existante qui doit avoir des connexions ouvertes.

1voto

WooYek Points 229

Au cas où quelqu'un d'autre tomberait sur cette page, j'ai découvert une autre raison pour laquelle cela peut se produire. J'avais créé une SqlCeTransaction pour envelopper plusieurs instructions, et j'ai accidentellement omis d'utiliser cette transaction sur l'une des instructions. C'est ce qui a provoqué le message Lock timeout.

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