Articles

Utilizarea cu (NOLOCK)

Posted by admin
  • postat pe Noiembrie 30, 2012 de Derek Dieter
  • 20

cu (nolock) indiciu este o comandă explicită direcționată către un anumit tabel sau vizualizare utilizate pentru a seta nivelul de izolare tranzacție împotriva tabelului sau tabele într-o vizualizare pentru o interogare. Odată emise, blocările nu vor fi utilizate împotriva datelor din tabel. Avantajul acestui lucru este că nu există nici o șansă un impas va avea loc împotriva oricăror alte interogări care rulează împotriva tabelului., Celălalt avantaj indirect este că mai puțină memorie va fi utilizată pentru a ține încuietori împotriva acestor date.

exemplu:

setarea nolock de mai sus este explicită pentru tabelul împotriva căruia este setat.,s nu va avea loc împotriva altor interogări care rulează împotriva aceleași date

  • mai Puțin de memorie este utilizat din cauza lipsei de rând, pagină, sau gama de nivelul de inchidere
  • de Obicei, permite mult mai mare concurenta din cauza pentru a reduce amprenta de
  • Dezavantaje:

    • date Nevalidate poate fi citit ceea ce duce la dirty reads
    • Explicite, indicii de masă sunt, în general, de rău practică

    Utilizare

    În cele mai multe locuri în care am lucrat, cu (nolock) a fost o practică general acceptată în anumite zone ale sistemului, care nu sunt sensibile la datele fiind ușor desincronizat., Este important să se știe în cazul în care lucrurile ar putea merge prost, deși. Cel mai mare steag roșu mă pot gândi pentru a nu utiliza NOLOCK ar fi un sistem care utilizează tranzacții explicite (începe TRAN ..END TRAN) sau utilizarea grele de declanșatoare. Mai multe declarații executate în cadrul unei tranzacții se confruntă cu o întârziere a operațiunilor de inserare / actualizare / ștergere, însă modificările sunt comise imediat după comitere., Declarațiile care interoghează datele modificate folosind nivelul de izolare read COMMITTED vor fi blocate de la a vedea aceste modificări până la comitere, în timp ce READ UNCOMMITTED (NOLOCK) va vedea modificările imediat indiferent de momentul în care are loc comiterea. Presupunerea aici este că, dacă sistemul dvs. utilizează tranzacții explicite sau se bazează foarte mult pe declanșatoare, poate fi plauzibil să presupunem că nolock nu este o idee bună.,

    a nu se folosi CU (NOLOCK) fără a înțelege pe deplin ramificațiile unei murdar citit

    Exemplu de Citire Murdar

    următorul exemplu va deschide o tranzacție în scopul de a actualiza first_name în coloana noastră globală tabel temp: ##numele meu

    DACĂ OBJECT_ID(‘tempdb..,##numele meu’) NU ESTE NUL
    BEGIN
    DROP TABLE ##numele meu;
    END;

    create TABLE ##numele meu
    (
    id int,
    first_name varchar(20)
    );

    INSERT INTO ##numele meu (id, first_name)
    VALUES (1, ‘dexter’);

    BEGIN TRAN

    ACTUALIZARE ##numele meu
    SET first_name = ‘derek’
    UNDE id = 1;

    Aici ne-au lăsat-o tranzacție deschide pe ##numele meu așa că rand este exclusiv blocat și nu poate fi citit de către orice tranzacție folosind nivelul de izolare citit comis sau mai mare.,aici veți vedea că prima interogare va afișa valoarea actualizată „derek”, în timp ce interogarea fără nolock se va închide așteptând lansarea tranzacției. Datele care au fost citite cu succes sunt considerate date murdare. Acest lucru este pentru că pot exista și alte tabele care trebuie să fie actualizat, care se referă la ‘derek’ înregistrare (id=1), pentru a afișa o vedere coerentă a tuturor datelor referitoare la ‘derek’.în cele din urmă, să ne angajăm tranzacția în fereastra noastră originală și veți vedea că acum Puteți interoga datele fără a utiliza (nolock).,

    COMITE TRAN
    SELECT * FROM ##numele meu;

    Depusă în conformitate cu TSQL

    Leave A Comment