2010-11-30 10 views
4

J'utilise SQL Server Express 2008 w/AdventureWorksLT2008 DB pour comprendre la différence entre Read Committed & Lecture non validée.SQL Understand Lire commis et lecture non validée

Selon Wikipedia: http://en.wikipedia.org/wiki/Isolation_%28database_systems%29

READ COMMITTED

Les enregistrements de données récupérées par une requête sont pas empêché de modification par d'autres transactions.

Supposons qu'il ya une table nommée SalesLT.Address et une colonne AddressLine2 toutes les lignes qui ont une valeur vide

alt text

Alors je lance cette requête:

SET TRANSACTION ISOLATION LEVEL READ COMMITTED 

BEGIN TRANSACTION 
    update SalesLT.Address set AddressLine2 = 'new value' 

     BEGIN TRANSACTION 
      select AddressLine2 from SalesLT.Address 

--Break Here 
/*  
     COMMIT TRANSACTION 
COMMIT TRANSACTION 
*/ 

Ainsi, vous pouvez voir que la première transaction n'a pas encore été validée, et la seconde commence interroger les données.

Il en résulte:

alt text

Alors, pourquoi la deuxième transaction peut être récupéré les données fantômes même la 1ère transaction toujours pas engagée?

Répondre

6

Lorsque les données sont lues dans une transaction, les modifications qui ont été apportées par cette opération sont visibles - dans ce tranasction seulement (bien que READ UNCOMMITTED change cela). Donc, au-dessus, même si vous avez commencé une deuxième transaction imbriquée, vous êtes toujours dans la portée de la première transaction et pouvez donc lire les données modifiées et obtenir les «valeurs modifiées».

Une autre transaction, sur une SPID séparée par exemple, bloquerait si elle utilisait READ COMMITTED et a tenté de lire ces données.

+1

Pour ajouter this- ouvrir une nouvelle fenêtre de requête SQL (ce qui établit en fait une nouvelle connexion) et de tenter d'interroger votre table pendant que votre autre connexion est-il modifié dans une transaction, et vous verrez ce que vous attendez ici, votre table sera verrouillée. –

Questions connexes