Lecții din modul (4/4)
Niveluri de izolare
Dincolo de PENTRU ACTUALIZARE explicită, tranzacțiile au și reguli matematice înnăscute încorporate adânc în motor care guvernează cât de multă energie trebuie cheltuită izolând fiecare interacțiune individuală în mod implicit. Acesta se numește Nivel de izolare. În lumea SQL cunoaștem 4 standard, în ordinea puterii și siguranței dar evident invers în ceea ce privește performanța.
READ UNCOMMITTED:Nebunie anarhică, tranzacția ta va vedea fiecare modificare făcută de alții, inclusiv date temporare de la oameni la jumătatea propriilor scripturi. Nimeni nu îl folosește pe baze de date mari, din cauza erorilor constante de citire murdară.READ COMMITTED:(Implicit pentru Postgres). Veți vedea instantaneu date noi de îndată ce o terță parte emite un COMMIT, dar puteți deveni victima citirilor fantomă (văzând înregistrări noi la jumătatea fluxurilor de lucru lungi) sau a unei vederi consecvente neliniare.REPEATABLE READ:Mai greu. Pe durata sesiunii dumneavoastră mari de time-window „văd” baza de date înghețată în momentul în care a început interogarea mea, ignorând și ignorând total chiar și commit-urile oficiale finalizate de alte persoane! Protejează împotriva înregistrărilor care apar în mod magic, garantând stabilitate.SERIALIZABLE:Nivelul Dumnezeu (Super lent). Tratează fiecare tranzacție care se suprapune blocându-le și executându-le în serie în linie pe o singură bandă, avortând fără milă pe cele care se ciocnesc, eliminând de la rădăcină chiar și posibilitatea științifică a celei mai mici coliziuni, sacrificând 90% din randament ridicat.
Cum îl setați?
În loc de BEGIN; normal, tastați:
BEGIN ISOLATION LEVEL SERIALIZABLE;
-- and you proceed normally with your hermetically sealed isolation
UPDATE products SET stock = 10;
COMMIT;Sau în unele variante și motoare mai vechi îl alocați după pornire:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;Încercați-l singur
Începeți o tranzacție setând în mod oficial nivelul global pentru durata de viață a interogării la REPEATABLE READ pentru a crea un schimb înghețat, protejat.\nRețineți că la nivel de interogare nu are niciun scop decât dacă este urmat de altceva, așa că închideți-l gol cu „COMMIT”.
Afișează indiciu
Deschide cu BEGIN IZOLATION LEVEL REPEATABLE CIT; si incheiati cu COMMIT;
Soluție disponibilă după 3 încercări
Să încercăm nivelul nebun de serializabil și să inserăm niște date fictive.\nDeschideți un bloc „SERIALIZABLE”.\nActualizați numele categoriei Id=2 la „Nuovo Nome Segreto”.\nRulați atomul final, stabilind comiterea.
Afișează indiciu
ÎNCEPE NIVEL DE IZOLARE SERIALIZABIL;\nUPDATE categorii SET name = 'Nuovo Nome Segreto' WHERE id = 2;\nCOMMIT;
Soluție disponibilă după 3 încercări