Am 2 tabele:
1. X - cimp PK idx1, cimp x1(numar rinduri aprox 2.000.000)
2. Y - cimp PK idy1, cimp FK idx1 , cimp idz1, cimp valoare (nr rinduri aprox 3.000.000)
792
Am index pe FK idX1 pe tabela Y pentru rapiditate
Am facut un script de testare, care consta, in afara de select*uri pe X si pe Y, in urmatoarele:
inserez in Y cu null pe idx1 de mai multe ori (maxim 10, dupa cite am observat) si cu acelasi idz1
insert in X si iau valoarea lui idx1
fac update pe Y cu idx1 obtinut where idz1 = valoareIDz1 si idx1 is null
Ei, pe acest update da deadlock daca rulez 2 script-uri concurent .
Transaction (Process ID 85) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
(Cum stiu ca pe update - dupa ce am citit pe net tot felul de tot felul despre dead=lock - cum se vad - si l-am vazut, pina la urma, din Sql Server Logs + scriind la print-uri de am turbat ... Am pus si SQL Server Profiler si am vazut si acolo liniile ...)
Ce e ciudat este ca se updateaza doar 2-10 rinduri
Daca rulez un singur script nu da eroare
Daca scot index-ul de pe IdX1 de pe tabela Y - pot sa rulez si 100 de script-uri concurent - tot nu da eroare, dar dureaza ca naiba.
Stiti cumva ce as putea face -nu sa schimb codul - este ultima optiune
- ca sa nu mai dea deadlock ?
Baza de date este SQL 2000
Ignat Andrei
http://serviciipeweb.ro/iafblog