32 Уроку по delphi

    32 уроку по Delphi

Урок 24: Управління транзакціями


Всі операції, що виконуються з даними на SQL сервері, відбуваються в контексті транзакцій. Транзакція - це групова операція, тобто набір дій з базою даних; найістотнішим для цих дій є правило або все, або ні чого. Якщо під час виконання даного набору дій, на якомусь етапі неможливо провести чергове дію, то потрібно виконати повернення бази даних до початкового стану (зробити відкат транзакції). Таким чином (при правильному плануванні транзакцій), забезпечується цілісність бази даних. В даному уроці пояснюється, як починати, управляти і завершувати транзакції за допомогою SQL виразів. А так же розглядається питання про використання транзакцій в додатках, створених в Delphi. Вся наведена інформація стосується InterBase.
  • SQL -виражена для управління транзакціями


    Для управління транзакціями є три вирази:

    SET TRANSACTION - Починає транзакцію і визначає її поведінку.

    COMMIT- Зберігає зміни, внесені транзакцією, в базі даних і завершує транзакцію.

    ROLLBACK - Скасовує зміни, внесені транзакцією, і завершує транзакцію.

  • запуск транзакції
  • Виконувати транзакції можна, наприклад, з Windows Interactive SQL, з програми, з збереженої процедури або тригера. У загальному вигляді, синтаксис команди SQL для запуску транзакції.

    SET TRANSACTION [Access mode] [Lock Resolution]

    [Isolation Level] [Table Reservation]

    Значення, що приймаються за замовчуванням.

    SET TRANSACTION READ WRITE WAIT ISOLATION LEVEL SNAPSHOT

    SET TRANSACTION READ WRITE

    Явна транзакція - це транзакція, почата і завершена за допомогою методів об'єкта DataBase: StartTransaction, Commit, RollBack. Після початку явної транзакції, всі зміни, що вносяться до дані відносяться до цієї транзакції.

    Іншого способу почати явну транзакцію, ніж з використанням DataBase. немає. (Точніше кажучи, така можливість є, але це зажадає звернення до функцій API InterBase. Однак, це вже досить низькорівневе програмування.) Отже, в рамках одного з'єднання не можна почати дві транзакції.

    Неявна транзакція стартує при модифікації даних, якщо в даний момент немає явної транзакції. Неявна транзакція виникає, наприклад, при виконанні методу Post для об'єктів Table і Query. Тобто, якщо Ви відредагували запис, в DBGrid і переходите на інший запис, то це тягне за собою виконання Post. що, в свою чергу, призводить до початку неявній транзакції, оновленню даних усередині транзакції і її завершення. Важливо відзначити, що неявна транзакція, розпочата за допомогою методів Post, Delete, Insert, Append і т.д. закінчується автоматично.

    Для модифікації даних може використовуватися і PassThrough SQL- SQL- вираз, що виконується за допомогою методу ExecSQL класу TQuery. Виконання модифікації через PassThrough SQL також призводить до старту неявної транзакції. Подальша поведінка транзакції, розпочатої таким шляхом, визначається значенням параметра SQLPASSTHRU MODE для псевдоніма бази даних (або той-же параметр в св-ве Params об'єкта DataBase). Цей параметр може приймати три значення.
      • SHARED AUTOCOMMIT - слово SHARED вказує на те, що обидва види транзакцій (через Passthrough SQL і через методи TTable і TQuery) поділяють один і той же з'єднання до бази даних. Слово AUTOCOMMIT вказує на те, що неявна транзакція, почата через Passthrough SQL. завершується після виконання дії по модифікації даних (автоматично виконується COMMIT).
      • SHARED NOAUTOCOMMIT - відрізняється від попереднього тим, що неявна транзакція, почата через Passthrough SQL. не закінчується після виконання, її потрібно явно завершити, виконавши SQL- вираз "COMMIT".
      • NOT SHARED - транзакції різних типів працюють через різні з'єднання з базою. Дане значення параметра має на увазі також NOAUTOCOMMIT. Тобто все неявні PassthroughSQL -транзакціі потрібно завершувати явно - виконуючи SQL- вираз "COMMIT" для Passtrough SQL.
    Розглянемо можливі сценарії поведінки транзакцій при різних значеннях параметра.

    У першому випадку, якщо немає в даний момент розпочатої транзакції, то спроба модифікація даних методами TTable або TQuery. як і виконання через Passtrough SQL будь-якої операції призведе до старту неявної транзакції. Після виконання, така транзакція буде автоматично завершена (якщо не виникло помилки по ходу транзакції). Якщо вже є розпочата явно (метод StartTransaction об'єкта DataBase) транзакція, то зміни будуть проходити в її контексті. Усі транзакції використовують один і той-же з'єднання.

    У другому випадку все відбувається, як у першому. Відмінність в тому, що неявна PassthroughSQL- транзакція не завершується, поки не буде виконана команда "COMMIT".

    У третьому випадку, при виконанні команди Passthrough SQL. буде встановлено ще одне з'єднання, розпочато неявна транзакція і виконані дії по модифікації даних. Транзакція не буде завершена, поки не буде виконана команда "COMMIT". Наявність транзакції, розпочатої явно за допомогою DataBase ніяк не відіб'ється на ході виконання PassthroughSQL- транзакції. Поки PassthroughSQL- транзакція не завершиться, зміни, внесені до неї, не будуть бачити в об'єктах Table і Query. працюючих через іншу сполуку. PassthroughSQL- транзакції можна розглядати в певному сенсі, як транзакції з іншої програми.

    Взаємодія транзакцій даної програми з транзакціями з інших додатків визначається властивістю TransIsolation об'єкта DataBase. Для InterBase має сенс два значення: tiReadCommitted і tiRepeatableRead. Виконання методу StartTransaction в цих двох випадках рівносильно виконання SQL -виражена, відповідно.

    SET TRANSACTION READ WRITE WAIT ISOLATION LEVEL READ COMMITTED

    SET TRANSACTION READ WRITE WAIT ISOLATION LEVEL SNAPSHOT