ACID
Транзакция — это любое действие с базой данных: добавление, изменение или удаление информации. Важно, чтобы эти действия были надёжными.
Для надёжности транзакции должны следовать принципам ACID:
- Атомарность (Atomicity): Транзакция выполняется либо полностью, либо никак. Если что-то пошло не так на одном из шагов, все изменения отменяются.
- Согласованность (Consistency): Транзакция переводит БД из одного правильного состояния в другое. Все правила БД (например, что баланс не может быть отрицательным) должны соблюдаться.
- Изолированность (Isolation): Параллельные транзакции не мешают друг другу. Каждая работает так, как будто других нет.
- Долговечность (Durability): Если транзакция завершена успешно, её результаты сохраняются навсегда, даже при сбоях (например, отключении питания).
Näitus
Andmete Lisamine
CREATE DATABASE transaktMaksim;
USE transaktMaksim;
CREATE TABLE T (
id INT NOT NULL PRIMARY KEY,
s VARCHAR(40),
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');
INSERT INTO T(id, s) VALUES (4, 'fourth');

Lisamine ja siis ROLLBACK
BEGIN TRANSACTION;
INSERT INTO T(id, s) VALUES (5, 'FIVE');
SELECT * FROM T;
ROLLBACK;


Kustutamine ja siis ROLLBACK
BEGIN TRANSACTION;
DELETE FROM T WHERE id=1;
SELECT * FROM T;
ROLLBACK;
SELECT * FROM T;


Uuendamine ja siis ROLLBACK
BEGIN TRANSACTION;
UPDATE T SET si = 5
SELECT * FROM T;
ROLLBACK;
SELECT * FROM T;


Käsud
- COMMIT
Сохраняет изменения - ROLLBACK
Откатывает (отменяет) изменения - SAVEPOINT
Создаёт точку к которой группа транзакций может откатиться - SET TRANSACTION
Размещает имя транзакции.
Ülesanne
Esimene
Lisamine andmed
CREATE TABLE developers (
ID INT NOT NULL PRIMARY KEY,
NAME VARCHAR(50) NOT NULL,
SPECIALTY VARCHAR(50) NOT NULL,
EXPERIENCE INT NOT NULL,
SALARY INT NOT NULL
)
INSERT INTO developers
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),
(6, 'Ivan Ivanov', 'C#', 1, 900),
(7, 'Ludmila Geiko', 'UI/UX', 2, 1800)

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


SAVEPOINT
SAVEPOINT SP1;
DELETE FROM developers WHERE ID = 7;
DELETE FROM developers WHERE ID = 6;
DELETE FROM developers WHERE ID = 5;
ROLLBACK TO SP1;
RELEASE SAVEPOINT SP1;


Teine
Video: https://www.youtube.com/watch?v=shkt9Z5Gz-U
SQL Server
CREATE TABLE Tablets (
ProductId INT NOT NULL PRIMARY KEY,
Name VARCHAR(50) NOT NULL,
Price INT NOT NULL,
Qty INT NOT NULL
);
INSERT INTO Tablets
VALUES (1, 'Laptops', 2340, 100), (2, 'Desktops', 3467, 20);

UPDATE
BEGIN TRANSACTION;
UPDATE Tablets SET Qty = 200 WHERE ProductId = 1;
SELECT * FROM Tablets;
ROLLBACK;
SELECT * FROM Tablets;


ROLLBACK TRY
CREATE TABLE Addres (
AddresId INT NOT NULL PRIMARY KEY,
EmployeeNr INT NOT NULL,
HouseNr INT NOT NULL,
StreetAddres VARCHAR(50) NOT NULL,
City VARCHAR(50) NOT NULL,
PostalCode VARCHAR(50) NOT NULL
);
INSERT INTO Addres
VALUES (1, 101, 10, 'King Street', 'LONDON', 'CR27DW');
CREATE PROCEDURE UpdateAddres
AS
BEGIN
BEGIN TRY
BEGIN TRANSACTION
UPDATE Addres SET City = 'LONDON1'
WHERE AddresId = 1 AND EmployeeNr = 101
UPDATE Addres SET City = 'LONDON1 LONDON1 LONDON1 LONDON1 LONDON1 LONDON1 LONDON1 LONDON1 '
WHERE AddresId = 1 AND EmployeeNr = 101
COMMIT TRANSACTION
PRINT 'Commited'
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
PRINT 'Rolled Back'
END CATCH
END


XAMPP
Lisamine on sama nagu SQL Server

UPDATE
START TRANSACTION;
UPDATE Tablets SET Qty = 200 WHERE ProductId = 1;
SELECT * FROM Tablets;
ROLLBACK;
SELECT * FROM Tablets;


PROCEDURE
