Posted in

SQL Transaktsioonid

ACID

Транзакция — это любое действие с базой данных: добавление, изменение или удаление информации. Важно, чтобы эти действия были надёжными.

Для надёжности транзакции должны следовать принципам ACID:

  1. Атомарность (Atomicity): Транзакция выполняется либо полностью, либо никак. Если что-то пошло не так на одном из шагов, все изменения отменяются.
  2. Согласованность (Consistency): Транзакция переводит БД из одного правильного состояния в другое. Все правила БД (например, что баланс не может быть отрицательным) должны соблюдаться.
  3. Изолированность (Isolation): Параллельные транзакции не мешают друг другу. Каждая работает так, как будто других нет.
  4. Долговечность (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

Lisa kommentaar

Sinu e-postiaadressi ei avaldata. Nõutavad väljad on tähistatud *-ga