人民日报评论员:努力创造属于新时代的光辉业绩
Транза?кц?я (англ. transaction) — група посл?довних операц?й з базою даних, яка ? лог?чною одиницею роботи з даними. Транзакц?я може бути виконана або ц?лком ? усп?шно, дотримуючись ц?л?сност? даних ? незалежно в?д ?нших транзакц?й, що йдуть паралельно, або не виконана зовс?м, ? тод? вона не може справити н?якого ефекту. Транзакц?? оброблюються транзакц?йними системами, в процес? роботи яких створю?ться ?стор?я транзакц?й. Транзакц?? з базою даних використовуються для досягнення наступних ц?лей:
- Забезпечення над?йних робочих елемент?в, як? дозволяють правильно в?дновити роботу у випадку збо?в та збер?гати ц?л?сн?сть бази даних у випадку системних в?дмов, коли виконання операц?й зупиня?ться (повн?стю або частково) ? б?льш?сть операц?й над базою даних залишаються незавершеними з нез'ясованим статусом.
- Для забезпечення розд?льного доступу для процес?в, що одночасно звертаються до бази даних. При в?дсутност? ?золяц?? операц?й результати, отриман? процесами, можуть бути помилковими.
Розр?зняють посл?довн? (звичайн?), паралельн? ? розпод?лен? транзакц??. Розпод?лен? транзакц?? вбачають використання б?льш н?ж одн??? транзакц?йно? системи ? потребують набагато б?льш складно? лог?ки (наприклад, two-phase commit — двофазний протокол ф?ксац?? транзакц??). Також, в деяких системах реал?зован? автономн? транзакц??, або п?д-транзакц??, як? ? автономною частиною батьк?всько? транзакц??.
Приклад: необх?дно переказати з банк?вського рахунку номер 5 на рахунок номер 7 суму в 10 грошових одиниць. Цього можна досягти, наприклад, наведеною посл?довн?стю д?й:
- Почати транзакц?ю: прочитати баланс на рахунку номер 5
- зменшити баланс на 10 грошових одиниць: зберегти новий баланс рахунку номер 5
- прочитати баланс на рахунку номер 7
- зб?льшити баланс на 10 грошових одиниць: зберегти новий баланс рахунку номер 7
- Зак?нчити транзакц?ю
Ц? д?? являють собою лог?чну одиницю роботи ?переказ суми м?ж рахунками?, ?, таким чином, ? транзакц??ю. Якщо перервати дану транзакц?ю, наприклад, в середин?, ? не анулювати вс? зм?ни, легко залишити власника рахунку номер 5 без 10 одиниць, тод? як власник рахунку номер 7 ?х не отрима?.
Одним з найб?льш розповсюджених набор?в вимог до транзакц?й ? транзакц?йних систем ? наб?р ACID (англ. Atomicity, Consistency, Isolation, Durability). Вимоги ACID були в головному сформульован? наприк?нц? 70-х рок?в Джимом ?ре?м[1]. Разом з тим, ?снують спец?ал?зован? системи з ослабленими транзакц?йними властивостями[2].
Атомарн?сть гаранту?, що н?яка транзакц?я не буде заф?ксована в систем? частково. Будуть або виконан? вс? ?? складов? операц??, або не виконано жодно?. Оск?льки на практиц? неможливо одночасно ? атомарно виконати всю посл?довн?сть операц?й усередин? транзакц??, вводиться поняття ?в?дкат? (англ. rollback): якщо транзакц?ю не вда?ться повн?стю завершити, результати вс?х ?? до сих п?р виконаних д?й будуть в?дм?нен?, ? система повернеться до стану на початок транзакц??.
Одна з найскладн?ших ? неоднозначних властивостей з четв?рки ACID. У в?дпов?дност? до ц??? вимоги, система знаходиться в узгодженому стан? до початку транзакц?? ? повинна залишитись в узгодженому стан? п?сля завершення транзакц??. Не можна плутати вимогу узгодженост? з вимогами ц?л?сност? (англ. integrity). Останн? правила ? б?льш вузькими ?, багато в чому, специф?чн? для реляц?йних СКБД: ? вимоги ц?л?сност? тип?в (англ. domain integrity), ц?л?сност? посилань (англ. referential integrity), ц?л?сност? сутностей (англ. entity integrity), як? не можуть бути порушен? ф?зично в силу особливостей реал?зац?? системи.
Узгоджен?сть ? б?льш широким поняттям. Наприклад, в банк?вськ?й систем? може ?снувати вимога р?вност? суми, що спису?ться з одного рахунку, сум?, що зачислю?ться на ?нший. Це б?знес-правило ? воно не може бути гарантовано т?льки перев?рками ц?л?сност?, його повинн? дотриматись програм?сти при написанн? коду транзакц?й. Якщо будь-яка транзакц?я викона? списання, але не викона? зачислення, то система залишиться в некоректному стан? ? властив?сть узгодженост? буде порушена.
Нарешт?, ще одне зауваження стосу?ться того, що п?д час виконання транзакц?? узгоджен?сть не потребу?ться. В нашому приклад?, списання ? зачислення будуть, скор?ш за все, двома р?зними п?доперац?ями ? м?ж ?х виконанням всередин? транзакц?? буде видно неузгоджений стан системи. Однак не треба забувати, що при виконанн? вимоги ?золяц??, жодним ?ншим транзакц?ям ця неузгоджен?сть не буде видна. А атомарн?сть гаранту?, що транзакц?я або буде повн?стю завершена, або жодна з операц?й транзакц?? не буде виконана. Тим самим ця пром?жна неузгоджен?сть ? прихованою.
П?д час виконання певно? транзакц??, транзакц??, як? в?дбуваються паралельно, не повинн? впливати на ?? результат. Ця властив?сть не дотриму?ться на р?вн? ?зольованост? Repeatable Read та нижче.
Незалежно в?д проблем на нижн?х р?внях (наприклад, при знеструмленн? системи чи збоях в обладнанн?), зм?ни, зроблен? транзакц??ю, яка усп?шно завершена, повинн? залишитись збереженими п?сля повернення системи до роботи. ?ншими словами, якщо користувач отримав п?дтвердження в?д системи, що транзакц?я виконана, в?н може бути впевнений, що зм?ни, як? в?н зробив, не будуть в?дм?нен? через будь-який зб?й.
В ?деал? транзакц?? р?зних користувач?в повинн? виконуватись так, щоб створювалась ?люз?я, що користувач поточно? транзакц?? — ?диний. Однак в реальност?, з м?ркувань продуктивност? ? для виконания деяких спец?альних задач, СКБД забезпечують певн? р?вн? ?золяц?? транзакц?й.
Р?вн? ? описаними в порядку зб?льшення ?зольованост? транзакц?й ?, в?дпов?дно, над?йност? роботи з даними.
- 0 — Читання неп?дтверджених даних (брудне читання) (Read Uncommitted, Dirty Read) — читання незаф?ксованих зм?н як сво?? транзакц??, так ? паралельних транзакц?й. Нема? гарант??, що дан?, зм?нен? ?ншими транзакц?ями, не будуть в будь-який момент зм?нен? в результат? ?х в?дката, тому таке читання ? потенц?йним джерелом помилок. Неможливими ? втрачен? зм?ни (lost changes), можливими ? неповторюван? читання ? фантоми.
- 1 — Читання п?дтверджених даних (Read Committed) — читання вс?х зм?н сво?? транзакц?? ? заф?ксованих зм?н паралельних транзакц?й. Втрачен? зм?ни ? брудне читання не дозволяються, можливими ? неповторюване читання ? фантоми.
- 2 — Повторюване читання (Repeatable Read, Snapshot) — читання вс?х зм?н сво?? транзакц??, будь-як? зм?ни, внесен? паралельними транзакц?ями п?сля початку сво??, ? недоступними. Втрачен? зм?ни, брудне ? неповторюване читання не ? можливими; можлив? фантоми.
- 3 — Впорядкований — (Serializable) — впорядкован? транзакц??. Результат паралельного виконання впорядковано? транзакц?? з ?ншими транзакц?ями повинен бути лог?чно екв?валентний результату ?х будь-якого посл?довного виконання. Проблеми синхрон?зац?? не виникають.
Чим вище р?вень ?золяц??, тим б?льше потребу?ться ресурс?в, щоб його забезпечити. В?дпов?дно, п?двищення ?зольованост? може приводити до зниження швидкост? виконання паралельних транзакц?й, що ? ?платою? за п?двищення над?йност?.
В СКБД р?вень ?золяц?? транзакц?й можна вибрати як для вс?х транзакц?й разом, так ? для одно? конкретно? транзакц??. За умовчанням в б?льшост? баз даних використову?ться р?вень 1 (Read Committed). Р?вень 0 використову?ться в основному для в?дстеження зм?н тривалих транзакц?й або для читання даних, що р?дко зм?нюються. Р?вн? 2 и 3 використовуються при п?двищених вимогах до ?зольованост? транзакц?й.
Повноц?нна реал?зац?я р?вн?в ?золяц?? ? властивостей ACID ? нетрив?альною задачею. Обробка вх?дних даних призводить до велико? к?лькост? маленьких зм?н, включаючи оновлення як самих таблиць, так ? ?ндекс?в. Ц? зм?ни потенц?йно можуть зазнати поразку: зак?нчилось м?сце на диску, операц?я займа? забагато часу (timeout) ? т. д. Система повинна у випадку невдач? коректно повернути базу даних у стан до транзакц??.
Перш? комерц?йн? СКБД (наприклад, IBM DB2), скористались виключно блокуванням доступу до даних для забезпечення властивостей ACID. Але велика к?льк?сть блокувань призводить до сутт?вого зменшення продуктивност?. ? два популярних с?мейства р?шень ц??? проблеми, як? знижують к?льк?сть блокувань:
- Журнал?зац?я зм?н (write ahead logging, WAL)
- механ?зм т?ньових стор?нок (shadow paging)[3].
В обох випадках, блокування повинн? бути розставлен? на всю ?нформац?ю, яка оновлю?ться. В залежност? в?д р?вня ?золяц?? ? ?мплементац??, блокування запис?в також розставляються на ?нформац?ю, яка була прочитана транзакц??ю.
При упереджуюч?й журнализац??, яка використову?ться в Sybase ? MS SQL Server до верс?? 2005, вс? зм?ни записуються до журналу, ? т?льки п?сля усп?шного завершення — до бази даних. Це дозволя? СКБД повернутись до робочого стану п?сля неоч?куваного пад?ння системи. Т?ньов? стор?нки м?стять коп?? тих стор?нок бази даних на початок транзакц??, в яких трапляються зм?ни. Ц? коп?? активуються п?сля усп?шного завершення. Хоча т?ньов? стор?нки легше реал?зуються, упереджуюча журнал?зац?я б?льш ефективна[4]
Подальший розвиток технолог?й керування базами даних прив?в до появи безблоковних технолог?й. ?дея контроля за паралельним доступом з допомогою часових м?ток (timestamp-based concurrency control) була розвинена ? привела до появи багатоверс?йно? арх?тектури MVCC. Ц? технолог?? не потребують н? журнализац?? зм?н, ан?ж т?ньових стор?нок. Арх?тектура, що реал?зована в Oracle 7.х ? вище, запису? стар? верс?? стор?нок в спец?альний сегмент в?дкату, але вони все ще доступн? для читання. Якщо транзакц?я при читанн? попада? на стор?нку, часова м?тка яко? нов?ше за початок читання, дан? беруться з сегменту в?дката (тобто використову?ться ?стара? верс?я). Для п?дтримки тако? роботи ведеться журнал транзакц?й, але на в?дм?ну в?д ?упереджуючо? журнал?зац???, в?н не м?стить даних. Робота з ним склада?ться з трьох лог?чних крок?в:
- Записати нам?р провести деяк? операц??
- Виконати завдання, коп?юючи ориг?нали стор?нок, що зм?нюються, до сегменту в?дката
- Записати, що все зроблено без помилок
Журнал транзакц?й в комб?нац?? з сегментом в?дката (область, в як?й збер?га?ться коп?я вс?х даних, що зм?нюються в ход? транзакц??) гаранту? ц?л?сн?сть даних. У випадку збою запуска?ться процедура в?дновлення, яка перев?ря? окрем? його записи наступним чином:
- Якщо запис ? пошкодженим, то зб?й трапився п?д час проставлення в?дм?тки в журнал?. Значить, н?чого важливого не загубилось, ?гнору?мо цю помилку.
- Якщо вс? записи пом?чен? як усп?шно виконан?, то зб?й трапився м?ж транзакц?ями, тут також нема? втрат.
- Якщо в журнал? ? незак?нчена транзакц?я, то зб?й трапився п?д час запису на диск. У цьому випадку ми в?дновлю?мо стару верс?ю даних з сегменту в?дката.
Firebird взагал? не ма? ан? журналу зм?н, ан? сегменту в?дката, а реал?зу? MVCC, записуючи нов? верс?? рядк?в таблиць прямо до активного простору даних. Так само робить ? MS SQL 2005. Теоретично це да? максимальну ефективность при паралельн?й робот? з даними, але ц?ною ? необх?дн?сть ?збирання см?ття?, тобто видалення старих ? вже не потр?бних верс?й даних.
- Транзакц?йна система
- Р?вн? ?зольованост? транзакц?й
- ACID
- Атомарн? операц??
- Програмна транзакц?йна пам'ять
- MVCC
- ↑ Gray, Jim. The Transaction Concept: Virtues and Limitations. Proceedings of the 7th International Conference on Very Large Databases: pages 144—154, 1981(англ.)
- ↑ Advanced Transaction Models and Architectures [Арх?вовано 2025-08-14 у Wayback Machine.](англ.)
- ↑ Семейство алгоритмов ARIES. Арх?в ориг?налу за 20 вересня 2008. Процитовано 6 травня 2014. [Арх?вовано 2025-08-14 у Wayback Machine.]
- ↑ Gray, J., McJones, P., Blasgen, M., Lindsay, B., Lorie, R., Price, T., Putzolu, F., and Traiger, I. The recovery manager of the System R database manager. ACM Comput. Surv. 13, 2 (June 1981).
![]() |
Це незавершена стаття про бази даних. Ви можете допомогти про?кту, виправивши або дописавши ??. |