Udostępnij przez


Uszeregowieniem

W idealnym przypadku transakcje powinny być serializowalne. Transakcje mówi się, że można serializować, jeśli wyniki uruchomionych transakcji jednocześnie są takie same jak wyniki uruchamiania ich szeregowo - czyli jeden po drugim. Nie jest ważne, która transakcja jest wykonywana jako pierwsza, tylko że wynik nie odzwierciedla żadnych mieszanych transakcji.

Załóżmy na przykład, że transakcja A mnoży wartości danych przez 2, a transakcja B dodaje wartość 1 do wartości danych. Teraz załóżmy, że istnieją dwie wartości danych: 0 i 10. Jeśli te transakcje są uruchamiane jeden po drugim, nowe wartości będą 1 i 21, jeśli transakcja A jest uruchamiana jako pierwsza, lub 2 i 22, jeśli transakcja B jest uruchamiana jako pierwsza. Ale co zrobić, jeśli kolejność, w której są uruchamiane dwie transakcje, jest inna dla każdej wartości? Jeśli transakcja A jest uruchamiana jako pierwsza na pierwszej wartości, a transakcja B jako pierwsza na drugiej wartości, nowe wartości to 1 i 22. Jeśli ta kolejność zostanie odwrócona, nowe wartości to 2 i 21. Transakcje można serializować, jeśli 1, 21 i 2, 22 są jedynymi możliwymi wynikami. Transakcje nie można serializować, jeśli 1, 22 lub 2, 21 jest możliwy wynik.

Dlaczego więc pożądana jest serializacja? Innymi słowy, dlaczego ważne jest, aby jedna transakcja zakończyła się przed rozpoczęciem następnej transakcji? Rozważmy następujący problem. Sprzedawca wprowadza zamówienia w tym samym czasie, gdy urzędnik wysyła rachunki. Załóżmy, że sprzedawca wprowadza zamówienie od firmy X, ale nie zatwierdza go; sprzedawca nadal rozmawia z przedstawicielem firmy X. Urzędnik żąda listy wszystkich otwartych zamówień i odnajduje zamówienie firmy X i wysyła im rachunek. Teraz przedstawiciel firmy X decyduje, że chce zmienić swoje zamówienie, więc sprzedawca zmienia go przed zatwierdzeniem transakcji. Firma X otrzymuje niepoprawny rachunek.

Gdyby transakcje sprzedawcy i urzędnika były serializowalne, ten problem nigdy nie miałby miejsca. Albo transakcja sprzedawcy zakończyłaby się przed rozpoczęciem transakcji urzędnika, w tym przypadku urzędnik wysłałby prawidłowy rachunek, lub transakcja urzędnika zakończyłaby się przed rozpoczęciem transakcji sprzedawcy, w tym przypadku urzędnik nie wysłałby rachunku do firmy X.