Sunteți pe pagina 1din 3

SQL Server Deadlock (Blocaj)

Când apare un blocaj în SQL Server?


Un blocaj are loc într-o bază de date atunci când două sau mai multe procese au deja o
resursă blocată, apoi fiecare proces dorește să obțină un blocaj pe resursa pe care celălalt proces a
blocat-o deja. În astfel de cazuri, niciunul dintre procesele nu poate avansa, deoarece fiecare
proces așteaptă ca celălalt proces să elibereze blocarea.
Următoarea diagramă explică punctele de mai sus, adică atunci când apare un blocaj într-
o bază de date.

Așa cum se arată în diagrama e mai sus, avem două procese (proces înseamnă tranzacții),
cum ar fi Procesul A și Procesul B. Avem în baza de date două tabele precum Tabelul A și Tabelul B.
Procesul A a început și achiziționează un blocaj pe tabela A, iar între timp Procesul B a început și a
achiziționat un blocaj pe Tabelul B. Acum pentru a finaliza execuția sa, procesul A are nevoie de
resursa Tabelului B care este deja blocată de Proces B. În același timp, Procesul B are nevoie de
resursa Tabelul A care este deja blocat de Procesul A. În astfel de cazuri niciuna dintre tranzacții
(procese) nu poate avansa, ceea ce duce la un impas.Când se produc blocaje în SQL Server, atunci
SQL Server alege unul dintre procesele (tranzacțiile) ca victimă a blocajului și apoi realizează
rollback acelui proces.
Drept urmare, alte procese pot avansa.
Procesul ales pentru victima impunerii va produce următoarea eroare.

Pentru a înțelege Deadlock se propune următorul exemplu.


Sunt folosite următoarele două tabele:
Utilizați scriptul SQL de mai jos pentru a crea și popula tabelele cu datele de testare.
-- Create table TableA
CREATE TABLE TableA
(
ID INT,
Name NVARCHAR(50)
)
Go
-- Insert some test data
INSERT INTO TableA values (101, 'Anurag')
INSERT INTO TableA values (102, 'Mohanty')
Go
-- Create table TableB
CREATE TABLE TableB
(
ID INT,
Name NVARCHAR(50)
)
Go
-- Insert some test data
INSERT INTO TableB values (1001, 'Priyanka')
INSERT INTO TableB values (1002, 'Dewagan')
Go
Următoarele 2 tranzacții vor duce la o situație de impas. Deschideți 2 instanțe ale SQL
Server Management Studio. Din prima instanță executați codul Tranzacție 1 și din a doua instanță
executați codul Tranzacție 2.
Cod tranzacție 1:
-- Transaction 1
-- Step1 Start
BEGIN TRANSACTION
UPDATE TableA Set Name = 'Anurag From Transaction1' WHERE Id = 101
-- Step1 End
-- From Transaction 2 Window execute the step2 section
-- Step3 Start
UPDATE Tableb Set Name = 'Priyanka From Transaction1' WHERE Id = 1001
-- Step3 End
-- From Transaction 2 Window execute the step4 section
COMMIT TRANSACTION

Cod tranzacție 2:
-- Transaction 2
-- Step2 Start
BEGIN TRANSACTION
UPDATE TableB Set Name = 'Priyanka From Transaction2' WHERE Id = 1001
-- Step2 End
-- From Transaction 1 window execute the Step3 section
UPDATE TableA Set Name = 'Anurag From Transaction2' WHERE Id = 101
Commit Transaction

Veți observa că după câteva secunde, una dintre tranzacții s-a finalizat cu succes, în timp
ce cealaltă tranzacție este aleasă ca victimă în impas, dând următoarea eroare.

Adaptare, profesor Arcan P.

S-ar putea să vă placă și