Рівень ізольованості транзакцій — значення, що задає рівень, при якому в транзакції дозволяються неузгоджені дані, тобто ступінь ізольованості однієї транзакції від іншої. Більш високий рівень ізольованості підвищує точність даних, але при цьому може знижуватись кількість транзакцій, що виконуються паралельно. З іншого боку, більш низький рівень ізольованості дозволяє виконувати більше паралельних транзакцій, але знижує точність даних.
Проблеми паралельного доступу з використанням транзакцій
При паралельному виконанні транзакцій можливі такі проблеми:
- втрачене оновлення (англ. lost update) — при одночасній зміні одного блоку даних різними транзакціями, одна із змін втрачається;
- «брудне» читання (англ. dirty read) — читання даних, які додані чи змінені транзакцією, яка потім не підтвердиться (відкотиться);
- неповторюване читання (англ. non-repeatable read) — при повторному читанні в рамках однієї транзакції, раніше прочитані дані з’являються зміненими;
- фантомне читання (англ. phantom reads) — одна транзакція в ході свого виконання декілька разів вибирає множину рядків за одними і тими ж критеріями. Інша транзакція в інтервалах між цими вибірками додає чи видаляє рядки чи змінює стовпці деяких рядків, що використовується в критеріях вибірки першої транзакції, і успішно закінчується. В результаті отримаємо, що одні і ті ж вибірки в першій транзакції дають різні множини рядків.
Розглянемо ситуації, в яких можливо виникнення даних проблем.
Втрачене оновлення
Ситуація, коли при одночасній зміні одного блоку даних різними транзакціями, одна зі змін втрачається.
Припустимо, є дві транзакції, що виконуються одночасно:
Транзакція 1 | Транзакція 2 |
---|---|
UPDATE tbl1 SET f2=f2+20 WHERE f1=1; | UPDATE tbl1 SET f2=f2+25 WHERE f1=1; |
В обох транзакціях змінюється значення поля f2, при цьому одна з змін втрачається. Так що, f2 буде збільшене не на 45, а тільки на 20 або 25.
Це трапляється тому, що:
- Перша транзакція прочитала поточний стан поля.
- Друга транзакція зробила свої зміни, базуючись на своїх, збережених в пам’яті, даних.
- Перша оновлює поле, використовуючи свої "старі" дані.
«Брудне» читання
Читання даних, які додані чи змінені транзакцією, яка згодом не підтвердиться (відкотиться).
Припустимо, є дві транзакції, відкриті в різних з’єднаннях з базою, в яких виконані такі SQL-оператори:
Транзакція 1 | Транзакція 2 |
---|---|
SELECT f2 FROM tbl1 WHERE f1=1; | |
UPDATE tbl1 SET f2=f2+1 WHERE f1=1; | |
SELECT f2 FROM tbl1 WHERE f1=1; | |
ROLLBACK; |
В транзакції 1 змінюється значення поля f2, а потім в транзакції 2 вибирається значення цього поля. Після цього трапляється відкат транзакції 1. В результаті значення, отримане другою транзакцією, буде відрізнятись від значення, що зберігається в базі даних.
Неповторюване читання
Ситуація, коли при повторному читанні в рамках однієї транзакції, раніше прочитані дані виявляються зміненими.
Припустимо, є дві транзакції, відкриті в різних сесіях, в яких виконані такі SQL оператори:
Транзакція 1 | Транзакція 2 |
---|---|
SELECT f2 FROM tbl1 WHERE f1=1; | SELECT f2 FROM tbl1 WHERE f1=1; |
UPDATE tbl1 SET f2=f2+1 WHERE f1=1; | |
COMMIT; | |
SELECT f2 FROM tbl1 WHERE f1=1; |
В транзакції 2 вибирається значення поля f2, потім в транзакції 1 змінюється значення поля f2. При повторній спробі вибору значення з поля f2 в транзакції 2 буде отриманий інший результат. Ця ситуація особливо неприйнятна, коли дані зчитуються для їх часткової зміни і зворотнього запису в базу даних.
Фантомне читання
Ситуація, коли при повторному читанні в рамках однієї транзакції одна і та ж вибірка дає різні множини рядків.
Припустимо, є дві транзакції, відкриті в різних сесіях, в яких виконані такі SQL оператори:
Транзакція 1 | Транзакція 2 |
---|---|
SELECT SUM(f2) FROM tbl1; | |
INSERT INTO tbl1 (f1,f2) VALUES (15,20); | |
COMMIT; | |
SELECT SUM(f2) FROM tbl1; |
В транзакції 2 виконується SQL оператор, який використовує всі значення поля f2. Потім, в транзакції 1, виконується вставка нового рядка, яка призводить до того, що повторне виконання SQL оператора в транзакції 2, видасть інший результат. Така ситуація називається фантомним читанням. Від неповторюваного читання воно відрізняється тим, що результат повторного звернення до даних змінився не через змінення/видалення самих цих даних, а через появу нових (фантомних) даних.
Рівні ізоляції
Стандарт SQL-92 визначає рівні ізоляції, установка яких запобігає деяким конфліктним ситуаціям. Введені наступні чотири рівні ізоляції:
Serializable (впорядкованість)
Найбільш високий рівень ізольованості; транзакції повністю ізолюються одна від одної. На цьому рівні результати паралельного виконання транзакцій для бази даних у більшості випадків можна вважати такими, що збігаються з послідовним виконанням тих же транзакцій (по черзі в будь-якому порядку).
Repeatable read (повторюваність читання)
Рівень, при якому читання одного і того ж рядку чи рядків в транзакції дає однаковий результат. (Поки транзакція не закінчена, ніякі інші транзакції не можуть змінити ці дані).
Read committed (читання фіксованих даних)
Прийнятий за замовчуванням рівень для Microsoft SQL Server. Закінчене читання, при якому відсутнє «брудне» читання (тобто, читання одним користувачем даних, що не були зафіксовані в БД командою COMMIT). Проте, в процесі роботи однієї транзакції інша може бути успішно закінчена, і зроблені нею зміни зафіксовані. В підсумку, перша транзакція буде працювати з іншим набором даних. Це проблема неповторюваного читання.
В Oracle блокування на читання немає, замість цього транзакція, що «читає», отримує ту версію даних, яка була актуальна в базі до початку тієї, що «пише».
В Informix можна запобігти конфліктам між транзакціями, що читають та пишуть, встановивши параметр конфігурації USELASTCOMMITTED (починаючи з версії 11.1), при цьому транзакція, що читає, буде отримувати останні підтверджені дані
Read uncommitted (читання незафіксованих даних)
Найнижчий рівень ізоляції, який відповідає рівню 0. Він гарантує тільки відсутність втрачених оновлень. Якщо декілька транзакцій одночасно намагались змінювати один і той же рядок, то в кінцевому варіанті рядок буде мати значення, визначений останньою успішно виконаною транзакцією.
Поведінка при різних рівнях ізольованості
«+» — запобігає, «-» — не запобігає.
Рівень ізоляції | Фантомне читання | Неповторюване читання | «Брудне» читання | Втрачене оновлення |
---|---|---|---|---|
SERIALIZABLE | + | + | + | + |
REPEATABLE READ | - | + | + | + |
READ COMMITTED | - | - | + | + |
READ UNCOMMITTED | - | - | - | + |
Примітки
- Параметр конфигурации USELASTCOMMITTED http://publib.boulder.ibm.com/infocenter/idshelp/v115/topic/com.ibm.adref.doc/ids_adr_0186.htm
- Understanding Isolation Levels
- Understanding the Available Transaction Isolation Levels
Посилання
- SQL-92 Isolation Levels
- Isolation Levels in the Database Engine
- Overview of Oracle Database Transaction Isolation Levels
- Types of Isolation Level in MS SQL Server
- SET TRANSACTION ISOLATION LEVEL (Transact-SQL)
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Riven izolovanosti tranzakcij znachennya sho zadaye riven pri yakomu v tranzakciyi dozvolyayutsya neuzgodzheni dani tobto stupin izolovanosti odniyeyi tranzakciyi vid inshoyi Bilsh visokij riven izolovanosti pidvishuye tochnist danih ale pri comu mozhe znizhuvatis kilkist tranzakcij sho vikonuyutsya paralelno Z inshogo boku bilsh nizkij riven izolovanosti dozvolyaye vikonuvati bilshe paralelnih tranzakcij ale znizhuye tochnist danih Problemi paralelnogo dostupu z vikoristannyam tranzakcijPri paralelnomu vikonanni tranzakcij mozhlivi taki problemi vtrachene onovlennya angl lost update pri odnochasnij zmini odnogo bloku danih riznimi tranzakciyami odna iz zmin vtrachayetsya brudne chitannya angl dirty read chitannya danih yaki dodani chi zmineni tranzakciyeyu yaka potim ne pidtverditsya vidkotitsya nepovtoryuvane chitannya angl non repeatable read pri povtornomu chitanni v ramkah odniyeyi tranzakciyi ranishe prochitani dani z yavlyayutsya zminenimi fantomne chitannya angl phantom reads odna tranzakciya v hodi svogo vikonannya dekilka raziv vibiraye mnozhinu ryadkiv za odnimi i timi zh kriteriyami Insha tranzakciya v intervalah mizh cimi vibirkami dodaye chi vidalyaye ryadki chi zminyuye stovpci deyakih ryadkiv sho vikoristovuyetsya v kriteriyah vibirki pershoyi tranzakciyi i uspishno zakinchuyetsya V rezultati otrimayemo sho odni i ti zh vibirki v pershij tranzakciyi dayut rizni mnozhini ryadkiv Rozglyanemo situaciyi v yakih mozhlivo viniknennya danih problem Vtrachene onovlennya Situaciya koli pri odnochasnij zmini odnogo bloku danih riznimi tranzakciyami odna zi zmin vtrachayetsya Pripustimo ye dvi tranzakciyi sho vikonuyutsya odnochasno Tranzakciya 1 Tranzakciya 2 UPDATE tbl1 SET f2 f2 20 WHERE f1 1 UPDATE tbl1 SET f2 f2 25 WHERE f1 1 V oboh tranzakciyah zminyuyetsya znachennya polya f2 pri comu odna z zmin vtrachayetsya Tak sho f2 bude zbilshene ne na 45 a tilki na 20 abo 25 Ce traplyayetsya tomu sho Persha tranzakciya prochitala potochnij stan polya Druga tranzakciya zrobila svoyi zmini bazuyuchis na svoyih zberezhenih v pam yati danih Persha onovlyuye pole vikoristovuyuchi svoyi stari dani Brudne chitannya Chitannya danih yaki dodani chi zmineni tranzakciyeyu yaka zgodom ne pidtverditsya vidkotitsya Pripustimo ye dvi tranzakciyi vidkriti v riznih z yednannyah z bazoyu v yakih vikonani taki SQL operatori Tranzakciya 1 Tranzakciya 2 SELECT f2 FROM tbl1 WHERE f1 1 UPDATE tbl1 SET f2 f2 1 WHERE f1 1 SELECT f2 FROM tbl1 WHERE f1 1 ROLLBACK V tranzakciyi 1 zminyuyetsya znachennya polya f2 a potim v tranzakciyi 2 vibirayetsya znachennya cogo polya Pislya cogo traplyayetsya vidkat tranzakciyi 1 V rezultati znachennya otrimane drugoyu tranzakciyeyu bude vidriznyatis vid znachennya sho zberigayetsya v bazi danih Nepovtoryuvane chitannya Situaciya koli pri povtornomu chitanni v ramkah odniyeyi tranzakciyi ranishe prochitani dani viyavlyayutsya zminenimi Pripustimo ye dvi tranzakciyi vidkriti v riznih sesiyah v yakih vikonani taki SQL operatori Tranzakciya 1 Tranzakciya 2 SELECT f2 FROM tbl1 WHERE f1 1 SELECT f2 FROM tbl1 WHERE f1 1 UPDATE tbl1 SET f2 f2 1 WHERE f1 1 COMMIT SELECT f2 FROM tbl1 WHERE f1 1 V tranzakciyi 2 vibirayetsya znachennya polya f2 potim v tranzakciyi 1 zminyuyetsya znachennya polya f2 Pri povtornij sprobi viboru znachennya z polya f2 v tranzakciyi 2 bude otrimanij inshij rezultat Cya situaciya osoblivo neprijnyatna koli dani zchituyutsya dlya yih chastkovoyi zmini i zvorotnogo zapisu v bazu danih Fantomne chitannya Situaciya koli pri povtornomu chitanni v ramkah odniyeyi tranzakciyi odna i ta zh vibirka daye rizni mnozhini ryadkiv Pripustimo ye dvi tranzakciyi vidkriti v riznih sesiyah v yakih vikonani taki SQL operatori Tranzakciya 1 Tranzakciya 2 SELECT SUM f2 FROM tbl1 INSERT INTO tbl1 f1 f2 VALUES 15 20 COMMIT SELECT SUM f2 FROM tbl1 V tranzakciyi 2 vikonuyetsya SQL operator yakij vikoristovuye vsi znachennya polya f2 Potim v tranzakciyi 1 vikonuyetsya vstavka novogo ryadka yaka prizvodit do togo sho povtorne vikonannya SQL operatora v tranzakciyi 2 vidast inshij rezultat Taka situaciya nazivayetsya fantomnim chitannyam Vid nepovtoryuvanogo chitannya vono vidriznyayetsya tim sho rezultat povtornogo zvernennya do danih zminivsya ne cherez zminennya vidalennya samih cih danih a cherez poyavu novih fantomnih danih Rivni izolyaciyiStandart SQL 92 viznachaye rivni izolyaciyi ustanovka yakih zapobigaye deyakim konfliktnim situaciyam Vvedeni nastupni chotiri rivni izolyaciyi Serializable vporyadkovanist Najbilsh visokij riven izolovanosti tranzakciyi povnistyu izolyuyutsya odna vid odnoyi Na comu rivni rezultati paralelnogo vikonannya tranzakcij dlya bazi danih u bilshosti vipadkiv mozhna vvazhati takimi sho zbigayutsya z poslidovnim vikonannyam tih zhe tranzakcij po cherzi v bud yakomu poryadku Repeatable read povtoryuvanist chitannya Riven pri yakomu chitannya odnogo i togo zh ryadku chi ryadkiv v tranzakciyi daye odnakovij rezultat Poki tranzakciya ne zakinchena niyaki inshi tranzakciyi ne mozhut zminiti ci dani Read committed chitannya fiksovanih danih Prijnyatij za zamovchuvannyam riven dlya Microsoft SQL Server Zakinchene chitannya pri yakomu vidsutnye brudne chitannya tobto chitannya odnim koristuvachem danih sho ne buli zafiksovani v BD komandoyu COMMIT Prote v procesi roboti odniyeyi tranzakciyi insha mozhe buti uspishno zakinchena i zrobleni neyu zmini zafiksovani V pidsumku persha tranzakciya bude pracyuvati z inshim naborom danih Ce problema nepovtoryuvanogo chitannya V Oracle blokuvannya na chitannya nemaye zamist cogo tranzakciya sho chitaye otrimuye tu versiyu danih yaka bula aktualna v bazi do pochatku tiyeyi sho pishe V Informix mozhna zapobigti konfliktam mizh tranzakciyami sho chitayut ta pishut vstanovivshi parametr konfiguraciyi USELASTCOMMITTED pochinayuchi z versiyi 11 1 pri comu tranzakciya sho chitaye bude otrimuvati ostanni pidtverdzheni dani Read uncommitted chitannya nezafiksovanih danih Najnizhchij riven izolyaciyi yakij vidpovidaye rivnyu 0 Vin garantuye tilki vidsutnist vtrachenih onovlen Yaksho dekilka tranzakcij odnochasno namagalis zminyuvati odin i toj zhe ryadok to v kincevomu varianti ryadok bude mati znachennya viznachenij ostannoyu uspishno vikonanoyu tranzakciyeyu Povedinka pri riznih rivnyah izolovanosti zapobigaye ne zapobigaye Riven izolyaciyi Fantomne chitannya Nepovtoryuvane chitannya Brudne chitannya Vtrachene onovlennya SERIALIZABLE REPEATABLE READ READ COMMITTED READ UNCOMMITTED PrimitkiParametr konfiguracii USELASTCOMMITTED http publib boulder ibm com infocenter idshelp v115 topic com ibm adref doc ids adr 0186 htm Understanding Isolation Levels Understanding the Available Transaction Isolation LevelsPosilannyaSQL 92 Isolation Levels Isolation Levels in the Database Engine Overview of Oracle Database Transaction Isolation Levels Types of Isolation Level in MS SQL Server SET TRANSACTION ISOLATION LEVEL Transact SQL