Sdílet prostřednictvím


Serializovatelnost

V ideálním případě by transakce měly být serializovatelné. Transakce se označují jako serializovatelné, pokud výsledky souběžně spuštěných transakcí jsou stejné jako výsledky jejich spuštění za sebou - to znamená postupně. Není důležité, která transakce se spouští jako první, pouze že výsledek neodráží žádné kombinování transakcí.

Předpokládejme například, že transakce A vynásobí datové hodnoty 2 a transakce B přidá 1 k datovým hodnotám. Předpokládejme, že existují dvě datové hodnoty: 0 a 10. Pokud jsou tyto transakce spuštěny jeden po druhé, budou nové hodnoty 1 a 21, pokud je transakce A spuštěna jako první, nebo 2 a 22 pokud transakce B je spuštěna jako první. Ale co když se pořadí, ve kterém jsou dvě transakce spuštěny, liší pro každou hodnotu? Pokud je transakce A spuštěna první na první hodnotě a transakce B je spuštěna první na druhé hodnotě, nové hodnoty jsou 1 a 22. Pokud je toto pořadí obrácené, nové hodnoty jsou 2 a 21. Transakce jsou serializovatelné, pokud 1, 21 a 2, 22 jsou jedinými možnými výsledky. Transakce nejsou serializovatelné, pokud 1, 22 nebo 2, 21 je možný výsledek.

Proč je tedy serializovatelnost žádoucí? Jinými slovy, proč je důležité, aby se zdá, že jedna transakce skončí před zahájením další transakce? Zvažte následující problém. Prodejce zadává objednávky ve stejnou dobu, kdy úředník posílá faktury. Předpokládejme, že prodejce zadá objednávku od společnosti X, ale nezapíše ji; prodejce stále mluví se zástupcem společnosti X. Úředník požádá o seznam všech otevřených objednávek a zjistí objednávku společnosti X a pošle jim fakturu. Zástupce společnosti X se rozhodne, že chce změnit objednávku, takže prodejce objednávku upraví před potvrzením transakce. Společnost X získá nesprávnou fakturu.

Pokud by transakce prodejce a úředníka byly serializovatelné, k tomuto problému nikdy nedošlo. Buď by transakce prodejce byla dokončena před zahájením transakce úředníka, v takovém případě by úředník odeslal správnou fakturu, nebo by transakce úředníka skončila před zahájením transakce prodejce, v takovém případě by úředník neposlal fakturu společnosti X vůbec.