Confidențialitate & cookie-uri
acest site folosește cookie-uri. Continuând, sunteți de acord cu utilizarea lor. Aflați mai multe, inclusiv cum să controlați cookie-urile.
acest articol face parte din seria Oracle Performance Tuning și este creat pentru a descrie mecanismul de blocare Oracle.
o blocare este o resursă pe care trebuie să o țineți pentru a avea acces la resursă. Oracle are două tipuri de încuietori: enqueues și zăvoare, ne-ar concentra acum pe aceste mecanism de blocare individual.
Enqueues
Enqueues sunt încuietori sofisticate pentru gestionarea accesului la resurse partajate (cum ar fi tabele, rânduri, locuri de muncă, fire refaceți). O cerere poate fi solicitată în diferite niveluri / mod:
- Null
- row share
- Row exclusive
- Share
- Share row exclusive
- Exclusive
dacă o sesiune deține o solicitare în modul share, alte sesiuni pot apoi să enqueue în modul de partajare (pentru aceeași resursă). Dacă o sesiune deține o întrebare în modul exclusiv, alte sesiuni care doresc să o obțină – independent în ce nivel – trebuie să aștepte.
când accesul este cerut de o sesiune, se obține o structură de blocare și se face o cerere de a obține acces la resursă la un anumit nivel (mod). Structura de blocare este plasat pe una din cele trei liste legate care atârnă off de resurse, numit proprietarul (în cazul în care enqueue ar putea fi achiziționate), chelner (în cazul în care sesiunea este în așteptare pentru achiziționarea enqueue) și convertor (sesiunea deține enqueue într-un nivel, dar vrea să-l convertească la un alt) liste.
următoarele sunt unele tipuri comune de anchete:-
- TM-de fiecare dată când o sesiune dorește să blocheze o masă, se solicită o solicitare TM. Dacă o sesiune șterge un rând din tabelul părinte și o constrângere referențială (cheie străină) este creată fără un index pe tabelul copil sau dacă sesiunea actualizează coloana(coloanele) la care se referă cheia străină, atunci se ia o blocare partajare pe tabelul copil. În cazul în care o altă sesiune încearcă să facă modificări la copil-tabel trebuie să aștepte (pentru că ei doresc enqueue în modul exclusiv rând, și că nu este compatibil cu modul de partajare).
- TX – de îndată ce o tranzacție este începută, este necesară o solicitare TX. O tranzacție este definită în mod unic de numărul segmentului rollback, numărul slotului din tabelul de tranzacții al segmentului rollback și numărul de secvență al slotului. O sesiune poate aștepta o solicitare TX din mai multe motive:
- o altă sesiune blochează rândul solicitat
- când două sesiuni încearcă să introducă aceeași cheie unică într-un tabel (niciuna dintre ele nu a făcut o comitere), atunci ultima sesiune așteaptă ca prima să se angajeze sau să revină.
- nu există ITL gratuit (Lista de tranzacții interesate) în antetul blocului.
- ul-o sesiune a luat o blocare cu DBMS_LOCK.Funcția cerere.
zăvoarele
zăvoarele oferă un mecanism de serializare de nivel scăzut care protejează structurile de date partajate în SGA. Un zăvor este un tip de blocare care poate fi foarte rapid achiziționat și eliberat. Zăvoarele sunt de obicei utilizate pentru a împiedica mai multe procese să execute aceeași bucată de cod la un moment dat. Atunci când un zăvor este dobândit, acesta este dobândit la un anumit nivel pentru a preveni blocajele. Odată ce un proces dobândește un zăvor la un anumit nivel, acesta nu poate dobândi ulterior un zăvor la un nivel egal sau mai mic decât acel nivel (cu excepția cazului în care îl dobândește nowait). Asociat cu fiecare zăvor este o procedură de curățare care va fi apelată dacă un proces moare în timp ce țineți zăvorul. Această curățare se face folosind serviciile PMON. Implementarea subiacentă a zăvoarelor depinde de sistemul de operare, în special în ceea ce privește dacă un proces va aștepta un zăvor și cât timp.
scopul zăvoarelor este de a gestiona accesul simultan la structurile de date partajate, astfel încât un singur proces să poată accesa structura la un moment dat. Procesele blocate (procesele care așteaptă să execute o parte a codului pentru care un zăvor a fost deja obținut printr-un alt proces) vor aștepta până când zăvorul este eliberat. Oracle folosește instrucțiuni atomice precum” test and set ” pentru operarea pe zăvoare. Deoarece instrucțiunile de setare și zăvoarele libere sunt atomice, sistemul de operare garantează că un singur proces îl primește și pentru că este doar o singură instrucțiune, este destul de rapid.
cererile de blocare pot fi făcute în două moduri:
- willing-to-wait: o solicitare de mod” willing-to-wait” se va bucla, aștepta și solicita din nou până când se obține zăvorul.
- nu așteptați : în modul „nu așteptați”, procesul va solicita zăvorul și dacă nu este disponibil, în loc să așteptați, este solicitat altul. Numai atunci când toate eșuează, procesul serverului trebuie să aștepte.
diferența dintre zăvoarele& Enqueues
o diferență între un zăvor și o enqueue este că enqueue se obține folosind un mecanism de blocare specific OS, în timp ce un zăvor este obținut independent de OS. O solicitare permite utilizatorului să stocheze o valoare în blocare (adică modul în care o solicităm). OS lock manager ține evidența resurselor blocate. Dacă un proces nu poate fi acordat blocării, deoarece este incompatibil cu modul solicitat și blocarea este solicitată cu așteptare, sistemul de operare pune procesul solicitant pe o coadă de așteptare care este deservită în FIFO.
o altă diferență între zăvoare și enqueues este că enqueues menține și a ordonat coada de chelneri în timp ce zăvoarele nu. Toate procesele de așteptare pentru un zăvor încercați din nou simultan (în funcție de planificator). Aceasta înseamnă că oricare dintre chelneri ar putea obține zăvorul și, probabil, primul care încearcă să obțină zăvorul ar putea fi ultimul care îl obține efectiv. Chelnerii cu zăvor pot folosi cronometre pentru a se trezi și a încerca din nou sau se pot roti (numai în multiprocesoare) învârtindu-se pe un zăvor înseamnă a ține procesorul și a aștepta în așteptarea eliberării zăvorului într-un timp scurt).