2009-09-14 7 views
2

J'ai une application dans laquelle j'utilise Sql Compact 3.5 avec VS2008. J'exécute plusieurs threads dans mon application qui contacte la base de données compacte et accède à la ligne. Il sélectionne et supprime ces lignes de façon à ce qu'il sélectionne et donne à l'application 5 lignes et supprime ces lignes de la table. Il fonctionne très bien avec un seul thread mais si j'utilise plusieurs threads, c'est-à-dire si 3 threads ou plus sont en cours d'exécution, je reçois très souvent l'erreur TimeOut !!! J'ai augmenté la propriété Time out dans la chaîne de connexion mais cela ne m'a pas donné le résultat attendu. Le journal des erreurs est le suivant:SQL Server Compact a expiré en attente d'un verrou

SQL Server Compact a expiré en attente d'un verrou. Le temps de verrouillage par défaut est 2000ms pour les périphériques et 5000ms 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. [ID de session = 5, ID de thread = 4204, ID de processus = 4808, nom de table = XXX, type de conflit = x verrous (s blocs), ressource = TAB]

La requête que j'utilise pour extraire est la suivante:

" sélectionnez Top (5) * de l'ordre TableName par id, supprimer de TableName où id dans (select id supérieur (5) de l'ordre TableName par id); "

Est-il possible par que nous pouvons éviter cette exception Time Out ???????

La requête ci-dessus est une transaction dans VS2008 l'une utilisant SQLCECommand et l'autre utilisant SqlCEDataAdapter.

Toute idée !!!!!! Reply

Répondre

0

J'utilise par défaut la propriété de verrouillage Délai d'attente mais ne semble pas réagir ou quoi. Il me donne toujours la même erreur que j'ai gardé sa valeur de 10000. La requête attend jusqu'à ce moment-là et il trouve jusqu'à la table occupée et par conséquent il donne l'exception. Y a-t-il un moyen pour que nous ne verrouillions que la rangée au lieu de la table ??????

2

J'ai eu exactement le même problème. Je sais que c'est une vieille question, mais pour tout le monde Google pour une réponse, je l'ai résolu en appelant Reader.Close() sur mon DataReader quand j'en avais fini avec elle.

L'application était mono-thread mais je recevais tout le temps si j'avais fait trop de demandes trop rapidement.

J'espère que cela aide!

0

J'ai eu le même problème tout à l'heure ...

La question était que je l'avais fait une table ALTER dans une transaction, puis essayé de lire cette table plus tard dans la même transaction. Oops. Retiré la table ALTER de la transaction et tout est merveilleux à nouveau.

Questions connexes