SQL transaktsioonid

Атомарность – озночает что транзакция должна быть зафиксировано целеком

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

  • Atomicity -Атомарность – гарантирует, что любая транзакция будет зафиксирована только целиком
  • Consistency – Согласованность означает, что любая завершённая транзакция (транзакция, которая достигла завершения транзакции – end of transaction) фиксирует только допустимые результаты.
  • Isolation – Изолированность – Каждая транзакция должна быть изолирована от других, т.е. её результат не должен зависеть от выполнения других параллельных транзакций.
  • Durability – Долговечность – Эта концепция гарантирует, что если мы получили подтверждение о выполнении транзакции, то изменения, вызванные этой транзакцией не должны быть отменены из-за сбоя системы (например, отключение электропитания).

Без начало транзакций невозможно сделать откат этой транзакций

SQL
ROLLBACK;
SQL
--loome transaktsiooni
begin transaction;
Insert into T(id,s) values(5,'Five');
select * from T;

--tagasi võtmine
ROLLBACK;
select * from T;
SQL
--loome transaktsiooni 2 DELETE
begin transaction;
delete from T where id=1
select * from T;

--tagasi võtmine
ROLLBACK;
select * from T;

Ülesanne transaktsioonid

Loome tabeli tblMailingAddress

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

Sisestame andmed

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

Loome tabeli tblPhysicalAddress

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

Sisestame andmed

SQL
Insert into tblPhysicalAddress values (1, 101, '#10', 'King Street', 'Londoon', 'CR27DW')

Loome protseduri spUpdateAddress. Protseduur spUpdateAddress ajakohastab linna mõlemas tabelis LONDON. Kui see õnnestub, salvestatakse muudatused, vastasel juhul võetakse need tagasi.

SQL
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

Loome protseduuri spUpdateAddress. Protseduur ajakohastab mõlema tabeli linnad erinevatele väärtustele. Kui see õnnestub, salvestatakse muudatused, vastasel juhul võetakse need tagasi.

SQL
Alter Procedure spUpdateAddress
as
Begin
 Begin Try
  Begin Transaction
   Update tblMailingAddress set City = 'LONDON12' 
   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

Kontroll

SQL
exec spUpdateAddress

select * from tblMailingAddress where AddressId = 1 and EmployeeNumber = 101
select * from tblPhysicalAddress where AddressId = 1 and EmployeeNumber = 101

Kasutatud video
https://www.youtube.com/watch?v=shkt9Z5Gz-U

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

SQL
--Loome tabeli developers
Create table developers(
ID int not null identity(1,1) primary key,
NAME varchar(50),
SPECIALTY varchar(50),
EXPERIENCE SMALLINT not null,
SALARY int NOT null
);
SQL
insert into developers(NAME,SPECIALTY,EXPERIENCE,SALARY)
values('Eugene Suleimanov','Java',2,2500);

insert into developers(NAME,SPECIALTY,EXPERIENCE,SALARY)
values('Peter Romanenko','Java',3,3500);

insert into developers(NAME,SPECIALTY,EXPERIENCE,SALARY)
values('Andrei Komarov','C++',3,2500);

insert into developers(NAME,SPECIALTY,EXPERIENCE,SALARY)
values('Konstantin Geiko','C#',2,2000);

insert into developers(NAME,SPECIALTY,EXPERIENCE,SALARY)
values('Asya Suleimanova','UI/UX',2,1800);

insert into developers(NAME,SPECIALTY,EXPERIENCE,SALARY)
values('Ivan Ivanov','C#',1,900);

insert into developers(NAME,SPECIALTY,EXPERIENCE,SALARY)
VALUES('Ludmila Geiko','UI/UX',2,1800);

Teeme transaktsiooni

SQL
START TRANSACTION;
DELETE FROM developers 
WHERE SPECIALTY = 'C++';
SELECT * from developers; 
ROLLBACK;
SELECT * from developers; 

Teeme transaktsiooni

SQL
START TRANSACTION;
DELETE FROM developers WHERE ID = 7;
DELETE FROM developers WHERE ID = 6;
DELETE FROM developers WHERE ID = 5;
SELECT * FROM developers;
ROLLBACK;
SELECT * FROM developers