quelle est la différence entre TABLOCK
et TABLOCKX
http://msdn.microsoft.com/en-us/library/ms187373.aspx les états qui TABLOCK
est un verrou partagé tout en TABLOCKX
est un verrou exclusif. Est la première peut-être seulement un indice de serrure de toutes sortes? Et qu'est-ce que le concept de partage d'une serrure?
Réponses
Trop de publicités?Grande différence, TABLOCK
va essayer de la saisir "partagé" les verrous, et TABLOCKX
des verrous exclusifs.
Si vous êtes dans une transaction et que vous saisissez un verrou exclusif sur une table, par exemple:
SELECT 1 FROM TABLE WITH (TABLOCKX)
Pas d'autres processus seront en mesure de saisir toutes les verrous sur la table, le sens de toutes les requêtes essayant de parler à la table sera bloqué jusqu'à ce que la transaction soit validée.
TABLOCK
seulement attrape un verrou partagé, les verrous partagés sont libérés après une instruction est exécutée si votre isolation de la transaction est - READ COMMITTED
(par défaut). Si votre niveau d'isolation est plus élevé, par exemple: SERIALIZABLE
, verrous partagés sont maintenus jusqu'à la fin d'une transaction.
Les verrous partagés sont, hmmm, partagé. Sens 2 transactions peuvent lire les données de la table en même temps si les deux titulaires d'un S ou un verrou sur la table (via TABLOCK
). Toutefois, si transaction A
détient un verrou partagé sur une table, transaction B
ne sera pas en mesure de saisir un verrou exclusif jusqu'à ce que tous les verrous partagés sont libérés. Lisez à propos de laquelle les verrous sont compatibles avec msdn à l'adresse.
Les deux conseils de la cause de la db à contourner en prenant plus granulaire des serrures (comme de ligne ou de page de verrous de niveau). En principe, plus granulaire des serrures de vous permettre de mieux la concurrence. Ainsi, par exemple, une transaction pourrait être la mise à jour de la ligne 100 de votre tableau et une autre ligne 1000, dans le même temps, à partir de deux opérations (ce qui est difficile avec les verrous de page, mais permet de sauter).
En général granulaire serrures est ce que vous voulez, mais parfois, vous voudrez peut-être réduire db simultanéité pour augmenter les performances d'une opération particulière et d'éliminer le risque de blocages.
En général, vous ne devriez pas utiliser TABLOCK
ou TABLOCKX
, sauf si vous avez absolument besoin pour certains cas limites.
Tout à fait un vieil article sur mssqlcity tente d'expliquer les types de serrures:
Les verrous partagés sont utilisés pour des opérations qui ne change pas ou mettre à jour des données, par exemple une instruction SELECT.
Mise à jour des verrous sont utilisés lorsque SQL Server a l'intention de modifier une page, et, plus tard, favorise la page de mise à jour de verrouillage d'un verrou exclusif de la page avant de réellement faire les modifications.
Les verrous exclusifs sont utilisés pour les opérations de modification de données, telles que UPDATE, INSERT ou DELETE.
Ce qu'il n'a pas de discuter de l'Intention (ce qui en gros est un modificateur pour ces types de verrou). Intention (Partagé/Exclusif) les verrous sont les verrous détenus à un niveau plus élevé que le verrouillage réel. Ainsi, par exemple, si votre transaction a un verrou X sur une ligne, il aura également un verrou IX au niveau de la table (qui s'arrête à d'autres transactions de tenter d'obtenir une incompatibilité de verrouillage à un niveau plus élevé sur la table (par exemple une modification du schéma de verrouillage) jusqu'à ce que votre transaction est terminée ou annulée).
Le concept de "partage" d'une serrure est assez simple - plusieurs transactions peuvent avoir un verrou Partagé pour la même ressource, alors que seule une opération peut avoir un verrou Exclusif, et un verrou Exclusif s'oppose à toute transaction d'obtenir ou de conserver un verrou Partagé.