რა დონეების ტრანზაქციის იზოლაცია გაქვს მონაცემთა ბაზებში?
sobes.tech AI
პასუხი AI-სგან
SQL სტანდარტში განსაზღვრულია ოთხი იზოლაციის დონე ტრანზაქციებისთვის: Read Uncommitted, Read Committed, Repeatable Read, Serializable.
-
Read Uncommitted: ყველაზე დაბალი დონე. ტრანზაქცია შეუძლია წაიკითხოს მონაცემები, რომლებიც ჯერ კიდევ არ არის დადასტურებული (ანუ შესრულებულია სხვა ტრანზაქციით, რომელიც ჯერ კიდევ არ არის დასრულებული
COMMIT). ეს იწვევს "დამპალილ" წაკითხვებს (dirty reads). -
Read Committed: ტრანზაქცია ხედავს მხოლოდ იმ მონაცემებს, რომლებიც დადასტურებულია დაწყებამდე ან მისი შესრულების დროს. იცავს "დამპალილ" წაკითხვებს, მაგრამ იძლევა არასაიმედო წაკითხვებს (non-repeatable reads) და ფანტომებს (phantom reads).
- არასაიმედო წაკითხვები: იგივე წაკითხვა ერთ ტრანზაქციაში იძლევა სხვადასხვა მონაცემებს, რადგან სხვა ტრანზაქცია შეცვალა და დადასტურა მათ.
- ფანტომები: როდესაც
WHEREპირობით შეკითხვა ხორციელდება, მეორე ტრანზაქცია დამატებს ან წაშლის შესაბამისი სვეტებს, და იგივე შეკვეთა მეორედ შესრულებისას აბრუნებს სხვა მონაცემებს.
-
Repeatable Read: ტრანზაქცია ხედავს მხოლოდ იმ მონაცემებს, რომლებიც დადასტურებულია დაწყებამდე. გარანტიაა, რომ იგივე სვეტების მეორედ წაკითხვები ერთ ტრანზაქციაში იძლევა ერთნაირ მონაცემებს. იცავს "დამპალილ" და არასაიმედო წაკითხვებს. იძლევა ფანტომებს.
// Repeatable Read-ის მაგალითი // ტრანზაქცია 1 // BEGIN TRANSACTION; // SELECT COUNT(*) FROM users WHERE status = 'active'; // მაგალითად, 100 // ტრანზაქცია 2 (ერთდროულად) // BEGIN TRANSACTION; // INSERT INTO users (name, status) VALUES ('ახალი მომხმარებელი', 'active'); // COMMIT; // ტრანზაქცია 1 // SELECT COUNT(*) FROM users WHERE status = 'active'; // ისევ 100 (ფანტომი) // COMMIT; -
Serializable: ყველაზე მაღალი დონე. გარანტიაა, რომ პარალელური ტრანზაქციების შესრულება იქნება თანმიმდევრული, როგორც ერთდროულად შესრულებული. იცავს "დამპალილ" წაკითხვებს, არასაიმედო წაკითხვებს და ფანტომებს. შეიძლება გამოიწვიოს შესრულების შემცირება ბლოკირებების გამო.
სხვადასხვა მონაცემთა ბაზის მართვის სისტემებში შეიძლება არსებობდეს საკუთარი რეალიზაციები და სპეციფიკაციები დონეების, ასევე დამატებითი დონეები. მაგალითად, MySQL InnoDB-ის მიხედვით, Repeatable Read არის დეფოლტ დონე.