2010-03-19 7 views
0

J'ai besoin d'exécuter certains process stockés sur le serveur Sql d'une manière sûre pour les threads. Pour le moment j'utilise des verrous logiciels (verrous C#) pour y parvenir mais je me demande quel genre de fonctionnalités fournies par le serveur Sql lui-même pour obtenir la sécurité des threads. Il semble y avoir quelques fonctionnalités de verrouillage de table et de ligne intégrées au serveur Sql.Procédure stockée SQL Server dans des environnements multi-threads

Du point de vue de la performance, quelle est la meilleure approche? Verrous logiciels? Ou Sql Server construit dans les verrous?

Merci, Shamika

+0

Que font vos processus stockés? Si elles sont axées sur les transactions, peu importe le nombre de threads qui les exécutent simultanément. – Gabe

Répondre

4

Les fils à votre client vont avoir très peu à voir avec le comportement de votre base de données. SQL Server est une base de données multi-utilisateurs, donc tout le monde peut faire n'importe quoi à la base de données sur une machine différente en même temps, et toute la sécurité des threads dans le monde ne va pas aider avec ça. SQL Server utilisera des verrous pour gérer la base de données pendant les transactions, afin de garantir que les règles ACID et toutes les contraintes de base de données sont gérées.

Généralement, lorsque vous exécutez des procédures stockées sur une même machine sur le même thread, elles sont séquentielles et ne peuvent pas entrer en conflit. Si vous avez plusieurs threads ou si vous utilisez les fonctionnalités asynchrones d'ADO.NET, les procédures peuvent interférer entre elles au sein de SQL Server, c'est-à-dire le blocage ou l'interblocage, mais SQL Server va gérer tout cela. Évidemment, dans ce scénario, tout code que vous avez dans votre application doit être threadsafe - ie vous ne pouvez pas utiliser le même handle IAsyncResult pour les deux requêtes, vous devez vous assurer que les deux threads ne tentent pas de modifier les mêmes données le résultat des complétions, etc.

Vous devez exposer vos exigences un peu plus clairement, car il s'agit de deux scénarios de verrouillage complètement différents.

+0

Dans la procédure stockée la plus simple dans mon application, avant d'ajouter un nouvel enregistrement à une table, je vérifie d'abord l'existence. Je dois le faire d'une manière sûre de fil. – Shamika

+0

@Shamika - ce ne sera pas un problème de sécurité de threads à moins qu'un autre thread insère la même ligne (pourquoi votre application le ferait-elle?). –

+0

Les données que j'insère dans la base de données que je reçois d'une base de données externe pour laquelle je n'ai aucun contrôle. Même si je suis supposé obtenir des champs clés uniques de la base de données externe, j'ai trouvé que parfois ce n'est pas le cas. Donc, avant d'insérer ces enregistrements dans ma base de données, je dois faire cette validation de clé unique. L'insertion de données est multi-thread. – Shamika

Questions connexes