mars
2012
La norme SQL propose un moyen de poser des points de restaurations dans une transaction : les SAVEPOINTs. L’idée c’est de pouvoir revenir à une étape donnée dans la transaction. Selon la norme SQL la synthaxe pour créer un SAVEPOINT est la suivante :SAVEPOINT savepoint_name
et pour revenir en arrière :ROLLBACK TO SAVEPOINT savepoint_name
. La commande SAVEPOINT n’existe pas sous MS SQL SERVER mais une commande similaire exite : SAVE { TRAN | TRANSACTION } { savepoint_name | @savepoint_variable }
et pour revenir en arrière : ROLLBACK { TRAN | TRANSACTION } [ transaction_name | @tran_name_variable | savepoint_name | @savepoint_variable ]
La norme SQL:2003 introduit la commande RELEASE SAVEPOINT savepoint_name
qui permet de détruire un savepoint. Son équivalent SQL SERVER n’existe pas. MS SQL SERVER supprime les points de restauration automatiquement à la fin des transaction (COMMIT ou ROLLACK)
=> SAVEPOINT /ROLLBACK TO SAVEPOINT
–> Avec PostgreSQL
INSERT INTO table1 VALUES ('1');
SAVEPOINT savepoint1; -- création du savepoint1
INSERT INTO table1 VALUES ('2');
SAVEPOINT savepoint2; -- création du savepoint2
INSERT INTO table1 VALUES ('3');
ROLLBACK TO SAVEPOINT savepoint1; -- ROLLBACK TO savepoint1
COMMIT;
SELECT * FROM table1;
/*** résultat ***/
col
---
1
—> Avec MS SQL SERVER
CREATE TABLE table1 (col CHAR(1));
BEGIN TRAN Transaction_Principale
INSERT INTO table1 VALUES ('1')
SAVE TRAN savepoint1 -- création du savepoint1
BEGIN TRAN Transaction_Imbriquée
INSERT INTO table1 VALUES ('2')
SAVE TRAN savepoint2 -- création du savepoint2
INSERT INTO table1 VALUES ('3');
ROLLBACK TRAN savepoint1 -- ROLLBACK TO savepoint1
COMMIT ;
SELECT * FROM table1
/*** résultat ***/
col
---
1
=> SAVEPOINTS avec les mêmes noms
La norme SQL stipule que lorsqu’on crée un savepoint avec le même nom qu’un autre savepoint existant alors ce dernier doit être automatiquement détruit. le plus récent savepoint remplace donc l’ancien ayant le même nom.
–> Avec PostgreSQL
CREATE TABLE table1 (col CHAR(1));
BEGIN;
INSERT INTO table1 VALUES ('1');
SAVEPOINT savepoint1;
INSERT INTO table1 VALUES ('2');
SAVEPOINT savepoint1;
INSERT INTO table1 VALUES ('3');
ROLLBACK TO SAVEPOINT savepoint1;
COMMIT;
SELECT * FROM table1;
/*** résultat ***/
col
---
1
2
–> Avec MS SQL SERVER
CREATE TABLE table1 (col CHAR(1));
BEGIN TRAN Transaction_Principale
INSERT INTO table1 VALUES ('1')
SAVE TRAN savepoint1 -- création du savepoint1
BEGIN TRAN Transaction_Imbriquée
INSERT INTO table1 VALUES ('2')
SAVE TRAN savepoint1 -- création du savepoint2
INSERT INTO table1 VALUES ('3')
ROLLBACK TRAN savepoint1 -- ROLLBACK TO savepoint1
COMMIT ;
SELECT * FROM table1
/*** résultat ***/
col
---
1
2
=> RELEASE SAVEPOINT
–> Avec PostgreSQL
CREATE TABLE table1 (col CHAR(1));
BEGIN;
INSERT INTO table1 VALUES ('1');
SAVEPOINT savepoint1;
INSERT INTO table1 VALUES ('2');
SAVEPOINT savepoint2;
INSERT INTO table1 VALUES ('3');
RELEASE SAVEPOINT savepoint1;
COMMIT;
SELECT * FROM table1;
/*** résultat ***/
col
---
1
2
3
–> Avec MS SQL SERVER
BEGIN TRAN Transaction_Principale
INSERT INTO table1 VALUES ('1')
SAVE TRAN savepoint1 -- création du savepoint1
BEGIN TRAN Transaction_Imbriquée
INSERT INTO table1 VALUES ('2')
SAVE TRAN savepoint2 -- création du savepoint2
INSERT INTO table1 VALUES ('3')
COMMIT TRAN savepoint1 -- ROLLBACK TO savepoint1
COMMIT ;
SELECT * FROM table1
/*** résultat ***/
col
---
1
2
3
Comme MS SQL SERVER, ORACLE ne supporte pas non plus la commande standard RELEASE SAVEPOINT. Notons que parmi les SGBDs les plus connus du marché, MS SQL SERVER est le seul à ne pas implémenter la commande SAVEPOINT savepoint_name
. IBM DB2, ORACLE, PostGreSQL et « MySQL » ont tous implémenté la commande SAVEPOINT.
———————–
Etienne ZINZINDOHOUE
———————–