Direct naar de hoofdinhoud
Module 11 · Les 4 van 444/57 in de cursus~12 min
Modulelessen (4/4)

Isolatieniveaus

Naast expliciete FOR UPDATE hebben transacties ook aangeboren wiskundige regels die diep in de motor zijn ingebakken en bepalen hoeveel energie er moet worden besteed aan het standaard isoleren van elke individuele interactie. Dit wordt het Isolatieniveau genoemd. In de SQL-wereld kennen we 4 standaardversies, in volgorde van kracht en veiligheid, maar uiteraard het omgekeerde in termen van prestaties.

  • READ UNCOMMITTED: Anarchistische waanzin, uw transactie zal elke wijziging zien die door anderen is aangebracht, inclusief tijdelijke gegevens van mensen halverwege hun eigen scripts. Niemand gebruikt het op grote databases vanwege de constante Dirty Read-fouten.
  • READ COMMITTED: (standaard voor Postgres). U ziet direct nieuwe gegevens zodra een derde partij een COMMIT uitvoert, maar u kunt het slachtoffer worden van fantoomlezingen (het zien van nieuwe records halverwege uw lange workflows) of een niet-lineair consistent beeld.
  • REPEATABLE READ: Zwaarder. Gedurende de duur van je grote tijdvenstersessie "zie" ik dat de database bevroren is op het moment dat mijn zoekopdracht begon, waarbij ik zelfs de officiële commits die door andere mensen zijn gedaan totaal negeer en negeer! Het beschermt tegen het op magische wijze verschijnen van platen en garandeert stabiliteit.
  • SERIALIZABLE: God-niveau (super langzaam). Behandelt elke overlappende transactie door ze te blokkeren en serieel in één rij uit te voeren, waarbij de transacties die botsen meedogenloos worden afgebroken, waardoor zelfs de wetenschappelijke mogelijkheid van de geringste botsing bij de wortel wordt geëlimineerd, waardoor een solide 90% van de hoge doorvoer wordt opgeofferd.

Hoe stel je het in?

In plaats van de normale BEGIN; typ je:

SQL
BEGIN ISOLATION LEVEL SERIALIZABLE;

-- and you proceed normally with your hermetically sealed isolation
UPDATE products SET stock = 10;
COMMIT;

Of bij sommige varianten en oudere motoren wijst u dit toe na het starten:

SQL
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

Probeer het zelf

Oefening#sql.m11.l4.e1
Pogingen: 0Laden…

Start een transactie en stel het globale niveau voor de levensduur van de query formeel in op REPEATABLE READ om een ​​bevroren, beschermde uitwisseling te creëren.\nOnthoud dat het op queryniveau geen enkel nut heeft, tenzij het wordt opgevolgd door iets anders, dus sluit het leeg met 'COMMIT'.

Editor laden…
Toon hint

Open met BEGIN ISOLATIENIVEAU HERHAALBAAR LEZEN; en sluit af met COMMIT;

Oplossing beschikbaar na 3 pogingen

Oefening#sql.m11.l4.e2
Pogingen: 0Laden…

Laten we het waanzinnige serialiseerbare niveau proberen en wat fictieve gegevens invoegen.\nOpen een 'SERIALIZABLE'-blok.\nUpdate de naam van categorie Id=2 naar 'Nuovo Nome Segreto'.\nVoer de laatste atomaire, vereffenende commit uit.

Editor laden…
Toon hint

BEGIN ISOLATIENIVEAU SERIALISEERBAAR;\nUPDATE categorieën SET naam = 'Nuovo Nome Segreto' WAAR id = 2;\nCOMMIT;

Oplossing beschikbaar na 3 pogingen