Niveau d'isolement dans SQL Server 2008 R2

J'ai parcouru l'set du site Microsoft pour comprendre les niveaux d'isolement dans SQL Server 2008 R2. Cependant, avant d'en adopter une, je voudrais prendre en count les suggestions des experts du SO.

J'ai une page Web basée sur PHP principalement utilisée comme tableau de bord. Les users (pas plus de 5) downloadont des données en masse (environ 40 000 lignes) chaque jour, et environ 70 users n'auront access qu'à la database. S'il vous plaît noter que j'ai fixé un calendar pour ces 5 users pour le téléchargement, mais je veux confondre la preuve de la même chose pour toute perte de données. Aidez-moi avec les questions ci-dessous:

  • Quel est le meilleur niveau d'isolement que je peux utiliser?
  • L'isolation READ COMMITTED par défaut m'aidera-t-elle ici?
  • Existe-t-il également un moyen de définir le niveau d'isolation via SSMS pour une database particulière, autre que les instructions TSQL? (isolation universelle pour une database)

70 users auront les options de téléchargement, y at-il une chance que le db sera corrompu si tous ou la plupart d'entre eux essaient de download en même time? Comment puis-je éviter la même chose?

Toute suggestion d'experts ….

Cordialement, Yuvraj S

Les niveaux d'isolement concernent en réalité la durée de conservation des verrous partagés sur datatables lues. Mais comme Lieven le mentionne déjà: il ne s'agit PAS de prévenir la «corruption» dans la database – il s'agit d'empêcher les lecteurs et les écrivains de se gêner les uns les autres.

Tout d'abord: toute opération d'écriture ( INSERT , UPDATE ) nécessitera toujours un verrou exclusif sur cette ligne, et les verrous exclusifs ne sont compatibles avec rien d'autre – donc si une ligne à mettre à jour est déjà verrouillée, toute opération UPDATE devra attendre – Pas moyen de contourner cela.

Pour lire des données , SQL Server supprime les verrous partagés – et les niveaux d'isolement sont sur combien de time ils sont détenus.

Le niveau d'isolation par défaut ( READ COMMITTED ) signifie que: SQL Server tente d'get un verrou partagé sur une ligne et, en cas de succès, lit le contenu de la ligne et relâche immédiatement ce verrou. Le verrou n'existe donc que pour la courte période de lecture de la ligne. Les verrous partagés sont compatibles avec d'autres verrous partagés, de sorte que n'importe quel nombre de lecteurs peut lire les mêmes lignes en même time. Les verrous partagés empêchent cependant les verrous exclusifs, ainsi les verrous partagés empêchent la plupart des UPDATE sur les mêmes lignes.

Et puis il y a aussi le niveau d'isolation READ UNCOMMITTED – qui ne supprime pratiquement aucun verrou; Cela signifie qu'il peut également lire les lignes en cours de mise à jour et verrouillées de manière exclusive – afin d'get des données non validées – des données qui ne se refindont même pas dans la database (si la transaction mise à jour est annulée) – Sois prudent avec celui-ci!

Le niveau suivant est REPEATABLE READ , auquel cas les verrous partagés une fois acquis sont conservés jusqu'à la fin de la transaction en cours. Cela verrouille plus de lignes et pour une plus longue période de time – les lectures sont répétables puisque les lignes que vous avez lues sont verrouillées contre les mises à jour "derrière votre dos".

Et le niveau ultime est SERIALIZABLE dans lequel des plages entières pour les lignes (définies par votre clause WHERE dans le SELECT ) sont verrouillées jusqu'à la fin de la transaction en cours.

Mettre à jour:

Plus que la partie téléchargement (secondaire pour moi) Je suis inquiet à propos de 5 users essayant de mettre à jour une database en même time.

Eh bien, ne vous inquiétez pas – SQL Server va certainement gérer cela sans aucun problème!

Si ces 5 users simultanés (ou même 50) mettent à jour des lignes différentes, ils ne verront même pas quelqu'un d'autre. Les mises à jour vont arriver, aucune donnée ne sera blessée dans le process – tout va bien.

Si certains de ces users tentent de mettre à jour la même ligne , ils seront sérialisés. Le premier sera en mesure d'get le verrou exclusif sur la ligne, faire sa mise à jour, libérer le verrou, puis continuer. Maintenant, le deuxième user aurait sa chance – get le verrou exclusif, mettre à jour datatables, libérer le verrou, continuer.

Bien sûr: si vous ne faites rien à ce sujet , datatables du second user écraseront simplement la première mise à jour. C'est pourquoi il est nécessaire de vérifier les access concurrents. Vous devriez vérifier pour voir si datatables ont changé entre le moment où vous l'avez lu et le moment où vous voulez l'écrire; si cela a changé, cela signifie que quelqu'un d'autre l'a déjà mis à jour en même time -> vous devez penser à une stratégie de résolution de conflit simultanée pour ce cas (mais c'est une toute autre question en soi ….)