Sobes.tech
Middle+

Кадом транзаксияҳои параллелӣ иҷро мешаванд, кадом аномалияҳо метавонанд рух диҳанд?

sobes.tech AI

Ҷавоб аз AI

პარალელური ტრანზაქციების შესრულებისას შეიძლება წარმოიშვას შემდეგი ანომალიები:

  1. დაკარგული განახლება (Lost Update): ერთი ტრანზაქცია გადაწერს სხვა ტრანზაქციის ცვლილებებს მანამდე, სანამ ეს ცვლილებები დამტკიცებული იქნება.

    დრო ტრანზაქცია 1 ტრანზაქცია 2
    t1 კითხულობს ბალანსის მნიშვნელობას (მაგ., 100)
    t2 კითხულობს ბალანსის მნიშვნელობას (მაგ., 100)
    t3 ზრდის ბალანსს 10-ით (ბალანსი = 110)
    t4 ზრდის ბალანსს 20-ით (ბალანსი = 120)
    t5 დადასტურებს ცვლილებებს (ბალანსი ხდება 110)
    t6 დადასტურებს ცვლილებებს (ბალანსი ხდება 120)

    შედეგი: მიუხედავად ორი ზრდისა, საბოლოო ბალანსი არის 120, არა 130. ზრდა ტრანზაქცია 1-დან დაკარგულია.

  2. დამაბნეველი კითხვა (Dirty Read): ერთი ტრანზაქცია კითხულობს დაუდასტურებულ ცვლილებებს სხვა ტრანზაქციისგან. თუ ცვლილებები უკან დაიხევა, წაკითხული მონაცემები იქნება არასწორი.

    დრო ტრანზაქცია 1 ტრანზაქცია 2
    t1 იწყებს ბალანსის ცვლილებას (100 -> 110)
    t2 კითხულობს ბალანსს (მიღებს 110)
    t3 უკან იხევს ცვლილებას (ბალანსი დაბრუნდება 100)
    t4 იყენებს ბალანსს = 110 გამოთვლებში, მიუხედავად იმისა, რომ რეალური მნიშვნელობა 100ა

    შედეგი: ტრანზაქცია 2 ეფუძნება მონაცემებს, რომლებიც საბოლოოდ არ დამტკიცებულა.

  3. ნეიტრალური კითხვა (Non-Repeatable Read): ერთ ტრანზაქციაში ერთსა და იმავე სტრიქონის განმეორებითი კითხვა იძლევა სხვადასხვა მნიშვნელობას, რადგან სხვა ტრანზაქცია შეცვლის ამ სტრიქონს შორის კითხვებს.

    დრო ტრანზაქცია 1 ტრანზაქცია 2
    t1 კითხულობს ბალანსს (მიღებს 100)
    t2 შეცვლის ბალანსს 110-ზე და დადასტურებს
    t3 ისევ კითხულობს ბალანსს (მიღებს 110 ნაცვლად 100-ის)

    შედეგი: ბალანსი შეიცვალა ერთ ტრანზაქციაში, რაც შეიძლება გამოიწვიოს არასწორი შედეგები.

  4. ფანტომური კითხვა (Phantom Read): მსგავსი ნეიტრალური კითხვაა, მაგრამ ეხება არა არსებული სტრიქონების ცვლილებას, არამედ სტრიქონების დამატებას ან წაშლას, რომლებიც გავლენას ახდენენ შეკითხვის შედეგებზე.

    დრო ტრანზაქცია 1 ტრანზაქცია 2
    t1 ახორციელებს შეკითხვას SELECT COUNT(*) FROM Orders WHERE Status = 'Pending' (მიღებს 5)
    t2 დამატებს ახალ შეკვეთას სტატუსით 'Pending' და დადასტურებს
    t3 ისევ ახორციელებს SELECT COUNT(*) FROM Orders WHERE Status = 'Pending' (მიღებს 6)

    შედეგი: განმეორებითი შეკითხვის დროს გამოჩნდება "ფანტომური" სტრიქონები, რომლებიც პირველად კითხვაზე არ იყო.

ამ ანომალიებს თავიდან აცილება შესაძლებელია ტრანზაქციების სხვადასხვა იზოლაციის დონეების გამოყენებით.