Documente Academic
Documente Profesional
Documente Cultură
Bine ați venit la laboratorul nostru despre gruparea interogărilor în tranzacții în MySQL. În acest
laborator, veți învăța despre conceptul de tranzacții și modul în care acestea pot fi utilizate pentru
a grupa și gestiona interogările în cadrul unei baze de date. Vom folosi baza de date "employees"
pentru a explora aceste concepte. Urmați pașii de mai jos pentru a finaliza laboratorul.
Exemplu:
use accounts;
name VARCHAR(30),
balance DECIMAL(10,2)
);
+-------+---------+
| name | balance |
+-------+---------+
| Paul | 1000.00 |
| Peter | 2000.00 |
+-------+---------+
Page | 1
-- Transfer banii dintr-un cont in altul
START TRANSACTION;
+-------+---------+
| name | balance |
+-------+---------+
| Paul | 900.00 |
| Peter | 2100.00 |
+-------+---------+
START TRANSACTION;
+-------+---------+
| name | balance |
+-------+---------+
| Paul | 900.00 |
| Peter | 2100.00 |
+-------+---------+
Page | 2
Dacă deschizi un alt client MySQL și faci un SELECT în timpul tranzacției (înainte de commit
sau rollback), nu vei vedea modificările.
În mod alternativ, poți dezactiva modul numit autocommit, care este activat în mod implicit și va
face commit la fiecare instrucțiune SQL în parte.
SET autocommit = 0;
COMMIT;
+-------+---------+
| name | balance |
+-------+---------+
| Paul | 800.00 |
| Peter | 2200.00 |
+-------+---------+
ROLLBACK;
+-------+---------+
| name | balance |
+-------+---------+
| Paul | 800.00 |
Page | 3
| Peter | 2200.00 |
+-------+---------+
-- session 1
SELECT *
FROM sakila.actor
ORDER BY last_update DESC
LIMIT 5;
START TRANSACTION;
INSERT INTO sakila.actor (first_name, last_name)
VALUES ("BRUCE", "JOHNSON");
SELECT last_name INTO @last_name
FROM sakila.actor
WHERE actor_id = LAST_INSERT_ID();
UPDATE sakila.actor
SET last_name = @last_name
WHERE actor_id = 1;
COMMIT;
-- session 2
SELECT *
FROM sakila.actor
ORDER BY last_update DESC
LIMIT 5;
+----------+------------+-----------+---------------------+
+----------+------------+-----------+---------------------+
Page | 4
| 201 | BRUCE | JOHNSON | 2021-04-04 15:58:56 |
+----------+------------+-----------+---------------------+
In exemplul de mai sus avem deschise doua sesiuni concurente la un server MySQL. In prima sesiune
este deschisa o tranzactie care include doua instructiuni de manipulare a datelor, o adaugare a unei noi
inregistrari, respectiv o actualizarea a valorilor de la nivelul unei alte inregistrari.
Actualizarea se desfasoara cu o valoare preluata din inregistrarea nou introdusa in tabelul sakila.actor.
Pentru a anula modificarile aduse bazei de date prin intermediul tranzactiei curente, se
utilizeaza instructiunea ROLLBACK. Actualizarile realizate asupra detelor din tabele
netranzactionale nu vor putea fi anulate, iar la apelul instructiunii ROLLBACK serverul va genera
un avertisment.
SELECT *
FROM sakila.actor
ORDER BY last_update DESC
LIMIT 5;
START TRANSACTION;
INSERT INTO sakila.actor (first_name, last_name)
VALUES ("BRUCE", "JOHNSON");
SELECT last_name INTO @last_name
FROM sakila.actor
WHERE actor_id = LAST_INSERT_ID();
UPDATE sakila.actor
SET last_name = @last_name
WHERE actor_id = 1;
Page | 5
SELECT *
FROM sakila.actor
ORDER BY last_update DESC
LIMIT 5;
ROLLBACK;
SELECT *
FROM sakila.actor
ORDER BY last_update DESC
LIMIT 5;
Chiar daca la nivelul tranzactiei sunt operate doua modificari asupra datelor din tabelul
sakila.actor, datele revin la versiunea precursoare tranzactiei prin finalizarea acesteia fara
salvarea rezultatelor. Acest lucru este asigurat prin intermediul instructiunii ROLLBACK.
+----------+------------+--------------+---------------------+
+----------+------------+--------------+---------------------+
+----------+------------+--------------+---------------------+
Page | 6
SELECT *
FROM sakila.actor
ORDER BY last_update DESC
LIMIT 5;
SELECT @@SESSION.autocommit;
SET autocommit = 0;
SELECT @@SESSION.autocommit;
connect
SELECT *
FROM sakila.actor
ORDER BY last_update DESC
LIMIT 5;
Utilizare savepoints
SELECT *
FROM sakila.actor
ORDER BY last_update DESC
LIMIT 5;
START TRANSACTION;
INSERT INTO sakila.actor (first_name, last_name)
VALUES ("BRUCE", "JOHNSON");
SELECT *
FROM sakila.actor
ORDER BY last_update DESC
LIMIT 5;
SAVEPOINT beforeUpdatePenelopeGuiness;
UPDATE sakila.actor
SET last_name = "JOHNSON"
WHERE actor_id = 1;
SELECT *
FROM sakila.actor
ORDER BY last_update DESC
LIMIT 5;
SELECT *
FROM sakila.actor
ORDER BY last_update DESC
LIMIT 5;
Page | 7
+----------+------------+-----------+---------------------+
+----------+------------+-----------+---------------------+
+----------+------------+-----------+---------------------+
Exemplu:
Page | 8
DELIMITER //
BEGIN
START TRANSACTION;
IF `_rollback` THEN
ROLLBACK;
ELSE
COMMIT;
END IF;
END//
DELIMITER ;
Page | 9
CALL test_rollback_proc();
Insa declare are nevoie de begin end altfel da eroarea "Declare is not valid at this position.
expecting EOF ;"
În afara unei rutine stocate, nu poți folosi DECLARE și IF..THEN..ELSE..END IF. Aceste lucruri
trebuie realizate în limbajul de programare al aplicatiei.
DELIMITER $$
BEGIN
BEGIN
END;
START TRANSACTION;
Page | 10
IF fail_condition_meet THEN
END IF;
END$$
DELIMITER ;
call sp_fail4;
DELIMITER $$
BEGIN
BEGIN
END;
START TRANSACTION;
Page | 11
UPDATE salaries SET to_date = 32132221 WHERE emp_no =10002;
END$$
DELIMITER ;
call sp_fail5;
Page | 12