Транзакции

Основные концепции транзакции описываются аббревиатурой ACID

  • Atomicity — Атомарность (Транзакция выполняется как единое целое — либо все её операции выполняются, либо ни одна.)

Пример: Вы переводите деньги с одного счёта на другой, транзакция включает списание с одного и зачисление на другой. Если произойдёт сбой после списания, но до зачисления — операция будет отменена полностью, чтобы не потерялись деньги.

  • Consistency — Согласованность (После завершения транзакции база данных остаётся в корректном, согласованном состоянии.)

Пример: Если база данных содержит правило, что сумма всех счетов должна быть равна 1000, то после любой транзакции это правило должно соблюдаться.

  • Isolation — Изолированность (Параллельные транзакции не мешают друг другу и не влияют на промежуточные результаты.)

Пример: Если два пользователя одновременно покупают последний товар, система должна обрабатывать заказы так, будто они выполняются по очереди, чтобы избежать двойной продажи.

  • Durability — Долговечность (После завершения транзакции её результат сохраняется в базе данных даже при сбое (например, отключении питания.))

Salvestame transaktsiooni

BEGIN transaction;
INSERT INTO t(id, s) VALUES (4, 'fourth')
SELECT * FROM t

Kustutame 1.rida ja võtame tagasi

BEGIN Transaction
DELETE FROM t WHERE id=1
SELECT * FROM t
ROLLBACK
SELECT * FROM t

Uuendame terve tabeli ja si=5 ja võtame tagasi

BEGIN Transaction
UPDATE t SET si = 5
SELECT * FROM t
ROLLBACK
SELECT * FROM t

XAMPP

START Transaction;
DELETE FROM t WHERE id=1;
SELECT * FROM t;
ROLLBACK;
SELECT * FROM t;
START Transaction;
SAVEPOINT SP1;
SELECT * FROM t;
UPDATE t SET si = 5;
SELECT * FROM t;
ROLLBACK TO SAVEPOINT SP1;
SELECT * FROM t

Ulesanne

Управление транзакциями

Для управления транзакциями используются следующие команды:

  • COMMIT
    Сохраняет изменения
  • ROLLBACK
    Откатывает (отменяет) изменения
  • SAVEPOINT
    Создаёт точку к которой группа транзакций может откатиться
  • SET TRANSACTION
    Размещает имя транзакции.
  1. Ulesanne

Loo uus tabeli developers

CREATE TABLE developers (
    ID INT PRIMARY KEY,
    NAME VARCHAR(255),
    SPECIALTY VARCHAR(255),
    EXPERIENCE INT,
    SALARY INT
);

INSERT INTO developers (ID, NAME, SPECIALTY, EXPERIENCE, SALARY) VALUES
(1, 'Eugene Suleimanov', 'Java', 2, 2500),
(2, 'Peter Romanenko', 'Java', 3, 3500),
(3, 'Andrei Komarov', 'C++', 3, 2500),
(4, 'Konstantin Geiko', 'C#', 2, 2000),
(5, 'Asya Suleimanova', 'UI/UX', 2, 1800),
(7, 'Ivan Ivanov', 'C#', 1, 900),
(8, 'Ludmila Geiko', 'UI/UX', 2, 1800);

Kasutame kõik inimesed kus SPECIALITY = C++

DELETE FROM developers WHERE SPECIALTY = 'C++';
COMMIT;

Muudatuse tagasipööramine

ROLLBACK;

Loo SAVEPOINT ja kasutame developers kus ID = 7,6,5

SAVEPOINT SP1;

DELETE FROM developers WHERE ID = 7;
DELETE FROM developers WHERE ID = 6;
DELETE FROM developers WHERE ID = 5;

Muudatuse tagasipööramine SAVEPOINT pärast

ROLLBACK TO SP1;

Kasutame SAVEPOINT

RELEASE SAVEPOINT SP1;

Funktsioon tehingu algatamiseks andmebaasis

SET TRANSACTION READ ONLY;

Funktsioon andmete kirjutamiseks andmebaasi

SET TRANSACTION READ WRITE;

2. Ulesanne

1.st example

Create Procedure spUpdateAddress
as
Begin
 Begin Try
  Begin Transaction
   Update tblMailingAddress set City = 'LONDON' 
   where AddressId = 1 and EmployeeNumber = 101
   
   Update tblPhysicalAddress set City = 'LONDON' 
   where AddressId = 1 and EmployeeNumber = 101
  Commit Transaction
 End Try
 Begin Catch
  Rollback Transaction
 End Catch
End


EXEC spUpdateAddress

2.nd example

Alter Procedure spUpdateAddress
as
Begin
 Begin Try
  Begin Transaction
   Update tblMailingAddress set City = 'LONDON1' 
   where AddressId = 1 and EmployeeNumber = 101
   
   Update tblPhysicalAddress set City = 'LONDON LONDON' 
   where AddressId = 1 and EmployeeNumber = 101
  Commit Transaction
 End Try
 Begin Catch
  Rollback Transaction
 End Catch
End

EXEC spUpdateAddress