SQL transactions

Транзакция – это последовательность операций, выполняемых в логическом порядке пользователем, либо программой, которая работает с БД.

Транзакция – это распространение изменений в БД. Например, если мы создаём, изменяем или удаляем запись, то мы выполняем транзакцию. Крайне важно контролировать транзакции для гарантирования.

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

  • Atomicity – Атомарность
  • Consistency – Согласованность
  • Isolation – Изолированность
  • Durability – Долговечность

Атомарность

гарантирует, что любая транзакция будет зафиксирована только целиком (полностью). Если одна из операций в последовательности не будет выполнена, то вся транзакция будет отменена. Тут вводится понятие “отката” (rollback). Т.е. внутри последовательности будут происходить определённые изменения, но по итогу все они будут отменены (“откачены”) и по итогу пользователь не увидит никаких изменений.

Согласованность

Согласованность означает, что любая завершённая транзакция (транзакция, которая достигла завершения транзакции – end of transaction) фиксирует только допустимые результаты. Например, при переводе денег с одного счёта на другой, в случае, если деньги ушли с одного счёта, они должны прийти на другой (это и есть согласованность системы). Списание и зачисление  – это две разные транзакции, поэтому первая транзакция пройдёт без ошибок, а второй просто не будет. Именно поэтому крайне важно учитывать это свойство и поддерживать баланс системы.

Изолированность

Каждая транзакция должна быть изолирована от других, т.е. её результат не должен зависеть от выполнения других параллельных транзакций. На практике, изолированность крайне труднодостижимая вещь, поэтому здесь вводится понятие “уровни изолированности” (транзакция изолируется не полностью).

Долговечность

Эта концепция гарантирует, что если мы получили подтверждение о выполнении транзакции, то изменения, вызванные этой транзакцией не должны быть отменены из-за сбоя системы (например, отключение электропитания).

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

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

XAMPP

Ülesanned

1. MySQL – Выполнить пример со следующей страницы https://proselyte.net/tutorials/sql/sql-transactions/

CREATE TABLE developers(
id int primary key AUTO_INCREMENT,
name varchar(50),
speciality varchar(50),
experience int,
salary int
);

insert into developers(name, speciality, experience, salary)
values ('Igor Abramov', 'C++', 4, 2500);
insert into developers(name, speciality, experience, salary)
values ('Kolja Nikolaev', 'Java', 2, 1200);
insert into developers(name, speciality, experience, salary)
values ('Magamed Jonikus', 'C++', 6, 2800);
insert into developers(name, speciality, experience, salary)
values ('Nikita Pushkalov', 'Python', 2, 1100);
insert into developers(name, speciality, experience, salary)
values ('John Biden', 'Pascal', 12, 800);

commit;

select * from developers;

SET autocommit=0;
START TRANSACTION;
DELETE FROM developers
WHERE speciality = ‘C++’;
SELECT * from developers

ROLLBACK;

START TRANSACTION;
select * from developers;
SAVEPOINT SP1;
DELETE FROM developers WHERE ID = 16;
DELETE FROM developers WHERE ID = 17;
DELETE FROM developers WHERE ID = 18;
select * from developers;

ROLLBACK to SP1;
SELECT * from developers;

2. SQL Server – найти на youtube.com видео относительно SQL транзакции и применить его к своей БД

-- Uus taablid

Create Table tblMailingAddress
(
AddressId int NOT NULL primary key,
EmployeeNumber int,
HouseNumber nvarchar(50),
StreetAddress nvarchar(50),
City nvarchar(10),
PostalCode nvarchar(50)
);

Insert into tblMailingAddress values (1, 101, '#10', 'King Street', 'Londoon', 'CR27DW');

Create Table tblPhysicalAddress
(
AddressId int NOT NULL primary key,
EmployeeNumber int,
HouseNumber nvarchar(50),
StreetAddress nvarchar(50),
City nvarchar(10),
PostalCode nvarchar(50)
);
Insert into tblPhysicalAddress values (1, 101, '#10', 'King Street', 'Londoon', 'CR27DW');

Loon uuendamine protseduur, mis uuendab linna nimi

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
;

–kontroll

select * from tblMailingAddress
exec spUpdateAddress
select * from tblMailingAddress

Siin ei ole viga, ja kõik admed on uuedanud

Uudistasin seda protseduui

Alter Procedure spUpdateAddress
as
Begin
Begin Try
Begin Transaction
Update tblMailingAddress set City = 'LONDON12'
where AddressId = 1 and EmployeeNumber = 101
select * from tblMailingAddress
Update tblPhysicalAddress set City = 'LONDON LONDON'
where AddressId = 1 and EmployeeNumber = 101

select * from tblPhysicalAddress
Commit Transaction
End Try
Begin Catch
Rollback Transaction
End Catch
End

–kontroll

select * from tblMailingAddress
exec spUpdateAddress
select * from tblMailingAddress

Aga siin protseduuris on viga ja ta rollback kõik.