Millised anomaaliad võivad tekkida paralleelsete tehingute teostamisel?
sobes.tech AI
Vastus AI-lt
Paralēli veicot transakcijas, var rasties šādas anomālijas:
-
Pazudusi atjaunināšana (Lost Update): Viena transakcija pārraksta citas transakcijas izmaiņas pirms to apstiprināšanas.
Laiks 1. transakcija 2. transakcija t1 Lasīšanas vērtība (piemēram, 100) t2 Lasīšanas vērtība (piemēram, 100) t3 Palielina balansu par 10 (Balanss = 110) t4 Palielina balansu par 20 (Balanss = 120) t5 Apstiprina izmaiņas (Balanss kļūst 110) t6 Apstiprina izmaiņas (Balanss kļūst 120) Rezultāts: Neskatoties uz abiem palielinājumiem, galīgais Balanss ir 120, nevis 130. Pirmās transakcijas palielinājums ir zaudēts.
-
Netīrs lasījums (Dirty Read): Viena transakcija lasa neapstiprinātas citas transakcijas izmaiņas. Ja izmaiņas tiks atceltas, lasītie dati būs nepareizi.
Laiks 1. transakcija 2. transakcija t1 Sāk mainīt balansu (100 -> 110) t2 Lasīšanas balansu (saņem 110) t3 Atceļ izmaiņas (Balanss atgriežas 100) t4 Izmanto balansu 110 skaitļošanas, lai gan faktiskā vērtība ir 100 Rezultāts: 2. transakcija balstās uz datiem, kas galā netika apstiprināti.
-
Neatkārtojams lasījums (Non-Repeatable Read): Vienā transakcijā atkārtots tā paša rindiņas lasījums dod dažādas vērtības, jo cita transakcija ir mainījusi šo rindiņu starp lasījumiem.
Laiks 1. transakcija 2. transakcija t1 Lasīšanas balansu (saņem 100) t2 Maina balansu uz 110 un apstiprina t3 Atkārtoti lasīšanas balansu (saņem 110, nevis 100) Rezultāts: Balanss ir mainījies vienas transakcijas laikā, kas var novest pie nepareiziem rezultātiem.
-
Fantomiskais lasījums (Phantom Read): Līdzīgs atkārtojamam lasījumam, bet attiecas ne uz esošo rindiņu izmaiņām, bet pievienošanu vai dzēšanu, kas ietekmē vaicājuma rezultātus.
Laiks 1. transakcija 2. transakcija t1 Veic vaicājumu SELECT COUNT(*) FROM Orders WHERE Status = 'Pending'(saņem 5)t2 Pievieno jaunu pasūtījumu ar statusu 'Pending' un apstiprina t3 Atkārtoti veic SELECT COUNT(*) FROM Orders WHERE Status = 'Pending'(saņem 6)Rezultāts: Vaicājuma atkārtošanas laikā parādās "fantomiskās" rindas, kuras sākotnējā lasījumā nebija.
Šīs anomālijas novērš, izmantojot dažādus izolācijas līmeņus.