Керування транзакціями

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

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

 

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

 

Транзакція повинна задовольняти ряду вимог.

q Довільна транзакція повинна бути або виконана, або відмінена.

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

q Транзакція не повинна залежати від виконання інших транзакцій і не впливати на них.

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

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

· Недопустиме використання операторів початку транзакції всередині транзакції.

· Не можна використовувати оператори надавання і позбавлення прав.

 

В багаторівневих програмах Delphi використання транзакцій забезпечує компонент TDatabase. Будь-які дії з довільними наборами даних, підключеними через дане з’єднання, що розміщуються між методом початку транзакції і методами фіксації або відкату транзакції, будуть виконуватися в рамках однієї транзакції. Початок транзакції задається методом StartTransaction. Фіксація транзакції здійснюється методом Commit. Відкат виконується методом Rollback.

with Databasel do try

StartTransaction;

Table1.Edit;

Table1.Fields[0].Value:= Null;

Table1.Post;

{ Довільні інші операції }

Commit;

except

Rollback;

end;

 

При використанні транзакції кінцевий запис обнуленого поля в таблицю набору даних Tablel відбудеться не після використання методу Post – (обнулене поле все-таки з’явиться в базі даних), як в звичайних випадках, а тільки після виконання методу commit. У випадку відкату транзакції полю буде повернено попереднє значення.

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

 

Для забезпечення захисту даних використовують механізм блокування. Блокуванням даних дозволяють керувати рівні ізоляції транзакцій — механізм визначення степені захищеності даних при багатокористувацькому доступі.

 

В Delphi рівні ізоляції транзакції простіше всього встановити за допомогою властивості TransIsolation компонента TDatabase. Підтримуються три рівня ізоляції транзакції.

q Незавершене читання (tiDirtyRead) — транзакція читає всі незавершені зміни, зроблені іншими транзакціями.

q Завершене читання (tiReadCommitted) — транзакція може читати тільки завершені зміни.

q Повторюване читання (tiRepeatableRead) — зміни, зроблені з інших транзакцій після читання набору даних, не видимі в даній транзакції. Тобто транзакція може зчитувати заново одні і ті ж дані, так як інші транзакції не мають до них доступу.

 

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

 

При малій кількості користувачів можна обійтися рівнем незавершеного читання.

 

Можливі помилки можна виправити за допомогою нехитрих перевірок ключових значень перед записом. Зате всі програми одержать необмежений доступ до даних.

 

Рівень завершеного читання дає приблизну рівність можливостей неблокованого доступу до даних і надійності даних.

 

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

 

Не всі сервери підтримують всі три рівні ізоляції транзакцій. Механізм блокування даних залижить від типу сервера. Большість серверів виконує блокування сторінками даних, розмір однієї сторінки може задаватися адміністратором, мінімальний розмір сторінки становить приблизно 1—2 Кбайт. В одній сторінці можуть зберігатися декілька записів або частина одного запису (залежить від структури таблиці). При виконанні деяких видів команд може бути заблокована ціла таблиця.

 

З А В Д А Н Н Я

1. Розмістіть компоненти на сторінці Оформлення покупки, як показано на рисунку.

2. Створіть таблицю TmpItems.db, в якій тимчасово накопичуються замовлення перед тим, як оформити покупку. Ця таблиця має такі поля: Part_Number – A 10, Description – A 10, Quantity – S, Retail_Price – N, Total_Price – N. Ключове поле – Part_Number.

3. Реалізуйте обробники подій кнопок Замовлення (перенесення замовлення до тимчасової таблиці).

if Edit1.Text = '' then

begin

showmessage('ZERO');

exit;

end;

TTmpItems.Insert;

TTmpItems.FieldByName('Part_Number').AsString:= TPart.Fields[0].AsString;

TTmpItems.FieldByName('Description').AsString:= TPart.Fields[1].AsString;

TTmpItems.FieldByName('Quantity').AsInteger:= StrToInt(Edit1.Text);

TTmpItems.FieldByName('Retail_Price').AsInteger:= TPart.Fields[4].AsInteger;

TTmpItems.FieldByName('Total_Price').AsInteger:= StrToInt(Edit1.Text) * TPart.Fields[4].AsInteger;

TTmpItems.Post;

TTmpItems.Refresh;

4. Сумарну вартість всіх замовлень обчисліть за допомогою компонента ТQuery, який за допомогою SQL запиту сумує по полю Total_Price тимчасової таблиці.

5. Оформіть звіт по роботі.

 

КОНТРОЛЬНІ ЗАПИТАННЯ

1. Що таке транзакція?

2. Що таке рівні ізоляції транзакцій?

3. Який компонент Delphi використовується для виконання транзакцій?

4. Що виконує метод Commit?

5. Яким вимогам повинна задовольняти транзакція?

 


Практична робота № 4


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: