SQL transaktsioonid

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

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

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

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

Атомарность

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

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

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

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

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

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

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

CREATE TABLE T(
id INT not null PRIMARY KEY,
s varchar(40),
si smallint);

INSERT INTO T(id,s) VALUES(1,'fisrt');
INSERT INTO T(id,s) VALUES(2,'second');
INSERT INTO T(id,s) VALUES(3,'third');
SELECT * FROM T;

--transaktsiooni loomine
begin transaction;
INSERT INTO T(id,s) VALUES(4,'fourth');
SELECT * FROM T;
--tegevuse tagasi võtmine
rollback;
SELECT * FROM T;
--loome transaktsiooni, mis võtab tagasi kustutatud
begin transaction;
delete from T where id>1
SELECT * FROM T;

rollback;
SELECT * FROM T;

XAMPP

CREATE TABLE T (id INT NOT NULL PRIMARY KEY, s VARCHAR(30), si SMALLINT);

INSERT INTO T (id, s) VALUES (1, 'first');
INSERT INTO T (id, s) VALUES (2, 'second');
INSERT INTO T (id, s) VALUES (3, 'third');
SELECT * FROM T ;
ROLLBACK; 

SELECT * FROM T ; 

START TRANSACTION; 

INSERT INTO T (id, s) VALUES (4, 'fourth'); 

SELECT * FROM T ; 

ROLLBACK; 

SELECT * FROM T; 
INSERT INTO T (id, s) VALUES (5, 'fifth'); 

ROLLBACK; 

SELECT * FROM T; 
SET AUTOCOMMIT = 0;

XAMPP ÜLESANNE

CREATE TABLE developers (id INT NOT NULL PRIMARY KEY, name VARCHAR(30), specilty varchar(30),si SMALLINT,salary int);
INSERT INTO `developers` (`id`, `name`, `specilty`, `experience`, `salary`) VALUES ('1', 'Eugene Suleimanov', 'Java', '2', '2500'); 

START TRANSACTION;

INSERT INTO developers (ID, name, specilty, 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);

COMMIT;

SQL VIDEO TUND

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')
CREATE PROCEDURE spUpdateAddress2
AS
BEGIN
    BEGIN TRY
        BEGIN TRANSACTION;

        
        UPDATE tblMailingAddress
        SET City = 'LONDON22'
        WHERE AddressId = 1 AND EmployeeNumber = 101;

        
        UPDATE tblPhysicalAddress
        SET City = 'LONDON13'
        WHERE AddressId = 1 AND EmployeeNumber = 101;

        COMMIT transaction;
    END TRY
    BEGIN CATCH
        ROLLBACK transaction;
    END CATCH;
END;

create table tblProduct(
productID int NOT NULL primary key,
NAME varchar(80),
UnitPrice int,
QityAvaible int);

insert into tblProduct(productID,NAME,UnitPrice,QityAvaible)
VALUES(1,'laptopts',2340,100)

Begin transaction
Update tblProduct set QityAvaible = 50 where productID = 1
rollback transaction;

select * from tblProduct

rollback transaction;

begin transaction
exec spUpdateAddress2;
SELECT * FROM tblMailingAddress;
SELECT * FROM tblPhysicalAddress;
rollback;

изменил название таблиц

с помощью процедуры изменил название city

rollback откатил изменения от