БАЗИ ДАНИХ. МОВИ ЗАПИТІВ, УПРАВЛІННЯ ТРАНЗАКЦІЯМИ,

РОЗПОДІЛЕНА ОБРОБКА ДАНИХ

 

2.3 Проблеми управління паралельним доступом

 

Управління паралельним доступом – це процес організації одночасного виконання в базі даних різних операцій доступу, який гарантує попередження їх впливу одна на одну.

Забезпечити паралельний доступ відносно нескладно, якщо всі користувачі будуть лише зчитувати інформацію з бази даних. В такому випадку робота кожного з них не впливатиме на роботу інших користувачів. Але якщо два чи більше користувачів одночасно звернуться до одного і того ж елемента даних або хоча б один з них спробує оновити збережену в базі даних інформацію, стає можливим взаємний вплив процесів доступу, який здатний привести до неузгодженості даних.

Задача управління паралельним доступом подібна до задач, які має вирішувати будь-яка багатокористувацька комп’ютерна система. Такі системи включають підсистему введення-виведення, яка здатна виконувати операції введення-виведення, в той час як процесор виконує інші операції. Система починає виконання першої транзакції і продовжує її виконання до першої операції введення-виведення. На час виконання цієї операції система призупиняє виконання першої транзакції та переходить до виконання команд другої транзакції. Коли другій транзакції потрібно буде виконати операцію введення-виведення, управління буде повернено першій транзакції та її виконання буде продовжено з тієї точки, в якій вона була призупинена. Виконання першої транзакції буде продовжено до досягнення наступної операції введення-виведення. Таким чином, виконання операцій двох транзакцій чергується та забезпечується їх паралельне виконання. Окрім того, загальна продуктивність системи (об’єм роботи, що виконується протягом заданого часового інтервалу) підвищується, оскільки процесор виконує команди іншої транзакції, замість того, щоб даремно простоювати, очікуючи завершення запущеної операції введення-виведення.

Не зважаючи на те, що кожна з транзакцій може сама по собі виконуватись коректно, подібне чергування операцій здатне привести до невірних результатів, через що цілісність і узгодженість бази даних будуть порушені.

Розрізняють такі потенційні проблеми, які можуть мати місце при паралельному виконанні транзакцій:

- проблема втраченого оновлення,

- проблема залежності від незафіксованих результатів,

- проблема аналізу неузгодженості,

- проблема неповторюваного читання,

- проблема фантомного читання.

 

Проблема втраченого оновлення полягає у тому, що результати цілком успішно завершеної операції  оновлення однієї транзакції можуть бути перекриті результатами виконання другої транзакції.

 

Приклад 2.1. Транзакція Т1 передбачає зарахування 1000 грн. на рахунок bal_X, на якому спочатку було 1000 грн., а транзакція Т2 полягає в знятті 100 грн. з цього ж рахунку. Якщо ж ці транзакції будуть виконуватись послідовно, одна за одною, без чергування операцій, то після завершення їх роботи на рахунку буде знаходитись сума 1900 грн., не залежно від порядку виконання транзакцій. Суть проблеми втраченого оновлення проілюстрована в табл. 2.1.

 

Таблиця 2.1 – Приклад проблеми втраченого оновлення

Час

Транзакція Т1

Транзакція Т2

Поле bal_X

t1

begin_transaction

 

1000

t2

read(bal_X)

begin_transaction

1000

t3

bal_X = bal_X +1000

read(bal_X)

1000

t4

write(bal_X)

bal_X = bal_X -100

2000

t5

commit

write(bal_X)

900

t6

 

commit

900

 

Припустимо, що транзакції Т1 і Т2 починаються практично одночасно і кожна з них зчитує вихідне значення суми на рахунку bal_X, яке рівне 1000 грн. Потім транзакція Т1 збільшує суму на 1000 грн. і записує результат, що рівний 2000 грн., в базу даних – на рахунок bal_X. В цей час транзакція Т2 зменшує на 100 грн. значення своєї копії початкової суми на рахунку bal_X і записує отримане значення, яке рівне 900 грн., в базу даних на той же рахунок, перекриваючи результат попереднього оновлення. В результаті з балансового рахунку «зникає» 1000 грн., доданих при виконанні попередньої операції.

Можна уникнути втрати результатів виконання транзакції Т1, заборонивши транзакції Т2 зчитувати початкове значення на рахунку bal_X до моменту завершення виконання транзакції Т2.     

 

Проблема залежності від незафіксованих результатів або проблема «брудного» читання виникає в тому випадку, коли одна із транзакцій отримає доступ до проміжних результатів виконання другої транзакції до того, як вони будуть зафіксовані в базі даних.

 

Приклад 2.2. Нехай транзакція Т3 збільшує значення суми на рахунку bal_X на 1000 грн., після чого виконання транзакції відміняється, тому СКБД повинна виконати відкат транзакції з відновленням початкового значення на рахунку, яке було рівне 1000 грн. Однак до цього моменту транзакція Т4 вже встигла зчитати змінене значення рахунку bal_X (2000 грн.) і використала саме це значення при виконанні операції зняття 100 грн. з рахунку, після чого зафіксувала в базі даних невірний результат, рівний 1900 грн. (замість правильного 900 грн.). Значення bal_X, зчитане в транзакції Т4, називається брудними даними. Причина відкату транзакції не має значення. Джерело помилки полягає у тому, що при виконанні транзакції Т4 приймається припущення про успішне завершення операції оновлення в транзакції Т3, хоча в дійсності відбувся відкат цієї транзакції. Суть проблеми «брудного» читання проілюстрована в табл. 2.2.

 

Таблиця 2.2 – Приклад проблеми «брудного читання»

Час

Транзакція Т3

Транзакція Т4

Поле bal_X

t1

begin_transaction

 

1000

t2

read(bal_X)

begin_transaction

1000

t3

bal_X = bal_X +1000

read(bal_X)

1000

t4

write(bal_X)

bal_X = bal_X -100

2000

t5

commit

write(bal_X)

900

t6

 

commit

900

 

Проблему «брудного» читання можна усунути, заборонивши транзакції Т4 зчитувати значення залишку bal_X до прийняття рішення про те, чи повинна бути виконана фіксація або відкат транзакції Т3.

 

У наведених прикладах мова йшла про транзакції, які виконують оновлення в базі даних, чергування операцій яких могло призвести до приведення бази даних в неузгоджений стан. Однак транзакції, які лише зчитують інформацію з бази даних, також можуть давати невірні результати, якщо їм стануть доступні проміжні результати одночасно виконуваних і ще не завершених транзакцій, які оновлюють інформацію в базі даних.

 

Проблема аналізу неузгодженості виникає в тих випадках, коли транзакція зчитує декілька значень з бази даних, після чого друга транзакція оновлює деякі з цих значень безпосередньо під час виконання першої транзакції. Наприклад, транзакція, яка знаходить суму значень, вибраних з бази даних, отримає невірний результат, якщо під час її виконання друга транзакція змінить зчитані нею значення.

 

Приклад 2.3. Транзакція Т6 знаходить суму залишків на рахунках  Х (1000 грн.), Y (500 грн.) та Z (250 грн.). Однак в цей час транзакція Т5 здійснює переведення по 100 грн. з рахунків bal_X і bal_Z. В результаті обчислене транзакцією Т6 значення виявляється невірним (більшим на 200 грн.). Приклад проблеми аналізу неузгодженості проілюстрований в табл. 2.3.

 

Таблиця 2.3 – Приклад проблеми аналізу неузгодженості

Час

Транзакція Т5

Транзакція Т6

Поле

bal_X

Поле

bal_Y

Поле

bal_Z

Поле

sum

t1

 

begin_transaction

1000

500

250

 

t2

begin_transaction

sum=0

1000

500

250

0

t3

read(bal_X)

read(bal_X)

1000

500

250

0

t4

bal_X= bal_X-100

sum = sum+bal_X

1000

500

250

1000

t5

write(bal_X)

read(bal_Y)

900

500

250

1000

t6

read(bal_Z)

sum = sum+bal_Y

900

500

250

1500

t7

bal_Z= bal_Z-100

read(bal_Z)

900

500

250

1500

t8

write(bal_Z)

sum = sum+bal_Z

900

500

150

1750

t9

 

commit

900

500

150

1750

t10

commit

 

900

500

150

1750

 

 Цю проблему можна вирішити, заборонивши транзакції Т6 зчитувати значення на рахунках bal_X та bal_Z до тих пір, поки транзакція Т5 не зафіксує виконані нею оновлення.

 

Проблема неповторюваного читання може виникнути, якщо в деякій транзакції відбувається повторне читання раніше зчитаного елемента даних, але між цими операціями читання була виконана модифікація цього елемента даних в іншій транзакції. Таким чином, в транзакції будуть отримані два різні значення одного і того ж елемента даних.

Проблема фантомного читання має місце тоді, коли деяка транзакція виконує запит на вибірку з відношення ряду рядків, які задовольняють деякому предикату, а при повторному виконанні цього запиту в більш пізній момент часу виявляється, що отримана множина рядків містить додаткові (фантомні) рядки, які були вставлені іншою транзакцією в період між двома операціями читання.

 

попередня     ЗМІСТ    наступна

 

 

Пєтух А.М., Романюк О.В., Романюк О.Н.

ВНТУ 2016