Administrarea tranzacțiilor cu serverul SQL

Gestionarea tranzacțiilor în SQL Server este un pas important în calea asigurării unei funcționări neîntrerupte și a unei modalități de evitare a erorilor legate de încuietori.

Glenn Berry, Louis Davidson și Tim Ford

În cele din urmă, toate instrucțiunile executate în SQL Server sunt tranzacționale. Când se execută chiar o singură instrucțiune SQL "sub capotă", este inițiată o tranzacție implicită. Este inițiată și terminată automat. Atunci când utilizați comenzi explicite BEGIN TRAN și COMMIT TRAN, le puteți combina în tranzacții explicite, adică seturi de instrucțiuni care trebuie executate de toate sau nici una.







În SQL Server implementează diferite niveluri de izolare tranzacție pentru a asigura proprietăți astfel de tranzacții, Atomicitate, consistența, izolarea și durabilitatea (ACID). În practică, acest lucru înseamnă că ei folosesc lung și blocarea pe termen scurt pentru a asigura accesul la baza de date tranzacțional partajată și pentru a preveni această operațiune nu interferează unele cu altele.

În general, strategia și procesul de cercetare și gestionare a tranzacțiilor SQL Server pot fi limitate la câteva întrebări-cheie:

  • Ce tranzacții sunt active și care sesiuni sunt deschise? (reprezentări administrative cu cuvintele session_transactions, active_transactions)
  • Ce tranzacții fac cea mai mare parte a activității? (reprezentări administrative cu cuvintele database_transactions)
  • Ce tranzacții creează probleme cu încuietori? (vizualizări administrative cu cuvântul "încuietori").

Monitorizarea tranzacțiilor "pe termen lung"

Al doilea, sys.dm_tran_session_transactions, "returnează informații despre relațiile dintre tranzacțiile și sesiunile conexe".

O descriere concisă a sys.dm_tran_database_transactions se ascunde mai mult decât descrie utilitatea reală a acestei vizualizări. Următorul script conține o interogare care arată pentru fiecare sesiune care baze de date sunt utilizate în tranzacția specială deschisă de această sesiune, dacă această tranzacție a fost tradusă în stare numai pentru citire într-o anumită bază de date (în mod implicit majoritatea tranzacțiilor sunt doar pentru citire) , când sa întâmplat, câte intrări au fost înregistrate și câte octeți au fost implicați în numele acestor intrări în jurnal:

SELECT st.session_id. DB_NAME (dt.database_id) AS numele bazei de date. CASE CÂND dt.database_transaction_begin_time ESTE NULL ÎNTÂLNIRE "numai pentru citire"

ELSE "citiți-scrie" END ca tranzacție_state. dt.database_transaction_begin_time AS read_write_start_time. dt.database_transaction_log_record_count. dt.database_transaction_log_bytes_usedFROM sys.dm_tran_session_transactions AS st INTERIOARĂ TE sys.dm_tran_database_transactions AS dt







Pe st.transaction_id = dt.transaction_idORDER BY st.session_id. nume_bază_date

Astfel de solicitări de depunere sys.dm_tran_database_transactions sunt foarte utile pentru a observa lucruri precum:

  • Sesiuni cu tranzacții deschise numai pentru citire (acest lucru este important în special pentru sesiunile de "dormit").
  • Sesiunile care duc la creșterea necontrolată a jurnalului de tranzacții.
  • Apărută în tranzacțiile "pe termen lung" (pentru operațiuni fără a utiliza logarea incompletă, o linie de index implicată creează aproximativ o intrare în jurnalul de tranzacții).

Blocare normală și pe termen scurt

În scriptul nostru de probă, folosim vizualizarea dinamică sys.dm_tran_locks, care este proiectată să funcționeze cu tranzacțiile și descrisă în documentația electronică după cum urmează: "Returnează informații despre resursele managerului de blocare active în prezent. Fiecare linie reprezintă solicitarea activă curentă către managerul de blocare despre blocarea care a fost primită sau așteaptă primirea. Coloanele din setul de rezultate sunt împărțite în două grupuri: o resursă și o interogare. Grupul de resurse descrie resursele la care sa făcut solicitarea de blocare, iar grupul de interogări descrie solicitarea de blocare. "

Această vizualizare administrativă este utilă pentru identificarea problemelor cu încuietori într-o instanță de bază de date:

-- Uită-te la resursele active Lock Manager pentru baza de date curentă

DB_NAME (resource_database_id) AS [Bază de date]. resource_type. resource_subtype. request_type. request_mode. resource_description. request_mode. request_owner_type
DIN sys.dm_tran_locksWHERE request_session_id> 50 AND resource_database_id = DB_ID () ȘI request_session_id <> @@ SPIDORDER BY request_session_id;

-- Căutați blocarea

SELECT tl.resource_type. tl.resource_database_id. tl.resource_associated_entity_id. tl.request_mode. tl.request_session_id. wt.blocking_session_id. wt.wait_type. wt.wait_duration_msFROM sys.dm_tran_locks AS tl INTERIOARĂ TE sys.dm_os_waiting_tasks AS wt ON tl.lock_owner_address = wt.resource_addressORDER PRIN wait_duration_ms DESC;

Prima interogare afișează o listă a tipurilor de blocare și a stării acestora în funcție de SPID-urile selectate pentru o bază de date, cu identificatorii actuali de conectare și identificatori de sistem SPID excluși din listă. A doua interogare oferă informații despre toate încuietorile din instanță. Rețineți că a doua solicitare se conectează la vizualizarea sys.dm_os_waiting_tasks pentru a obține date despre durata procesului de așteptare din cauza blocărilor și din cauza resursei.

De obicei, pentru a "prinde" o încuietoare, trebuie să efectuați fiecare dintre aceste solicitări de mai multe ori. Dacă găsiți două date declarație de modificare sau de interogare și să modifice datele, care sunt „împletesc“ într-o strânsă sau chiar impas, va trebui pentru a extrage textul SQL-interogări, le analizează, pentru a efectua pe un sistem de testare (cu urmărire activat de către Profiler) și pentru a rezolva problema modificați interogările sau adăugați indici.

Glenn Berry lucrează ca arhitect de baze de date la NewsGator Technologies din Denver, Columbia. El are titlul de MVP în SQL Server, și are un set de certificări Microsoft, inclusiv MCITP, MCDBA, MCSE, MCSD, MCAD și MCTS, ceea ce înseamnă că el într-adevăr îi place să ia examenele de certificare.

Louis Davidson (Louis Davidson) lucrează în domeniul IT de peste 16 ani ca dezvoltator și arhitect al bazelor de date corporative. El a deținut titlul de SQL Server MVP timp de șase ani și a scris patru cărți despre proiectarea bazei de date. El este în prezent implicat în dezvoltarea arhitecturii bazei de date si administrarea bazelor de date într-un pic Christian Broadcasting Network, sprijinirea activității ramurilor în orașul Virginia Beach, Virginia, și orașul Nashville, Tennessee.







Articole similare

Trimiteți-le prietenilor: