ENI RV Transactions dans un SGBD relationnel 1. Introduction Une transaction es
ENI RV Transactions dans un SGBD relationnel 1. Introduction Une transaction est un ensemble d'actions atomiques permettant de prendre une base donnée dans un état cohérent et de la rendre dans un état cohérent. Il s'agit d'éviter par exemple que l'on puisse lire une information que l'on est en train de modifier par ailleurs ou de mettre à jour, ou même que deux utilisateurs mettent à jour simultanément la même information. Par exemple : une transaction bancaire de transfert d'une somme S d'un compte C1 à un autre compte C2 ( on enlève sur un compte, on dépose sur l'autre.) (1) Début transaction (2) Lire (C1) // lire le compte C1 (3) C1=C1-S // débiter le solde de C1 (4) Ecrire (C1) (5) Lire (C2) // lire le compte C2 (6) C2=C2+S // créditer C2 (7) Ecrire (C2) (8) Fin-Transaction En supposant qu'avant l'exécution d'une telle transaction la base était dans un état cohérent. , on remarque que l'exécution incomplète de cette transaction peut mettre la base dans un état incohérent , c'est à dire lorsqu' une des deux opérations échoue. Par exemple , si l'exécution s'arrête après l'action (4) , le premier compte a bien débité mais le second n'a pas encore crédité. On veut que soit les deux opérations réussissent, mais si une d'elles échoue, on annule le tout et on remet les comptes dans l'état initial .On dit que les deux opérations forment une seule et même transaction . Un des avantages de la transaction est que si une transaction s'exécute toute seule, dans une base de données cohérente, alors elle va laisser la base de données dans un état cohérent La transaction peut être utilisée pour résoudre le problème de partage concurrent de données : plusieurs clients consultent et modifient les mêmes données et s'accorde avec les pannes machines ou réseau. La transaction vérifie les propriétés ACID (atomicité , cohérence , isolation et durabilité): Atomicité : une transaction doit effectuer ses mises à jour ou ne rien faire du tout. En cas d'échec , une transaction doit annuler toutes les modifications qu'elle a engagées. Cohérence : la transaction doit faire passer la base de données d'un état cohérent à un autre état. En cas d'échec , l'état courant cohérent initial doit être restauré. Isolation : les résultats d'une transaction ne doivent être visibles aux autres transactions qu'une fois la transaction validée , ceci afin d'éviter les interférences avec les autres transactions . Durabilité : dès qu'une transaction valide ses modifications , le système doit garantir que ces modifications seront conservées en cas de panne. 2.Mise en œuvre d'une transaction dans MySQL par BEGIN/COMMIT/ROLLBACK Par défaut, MySQL est lancé en mode autocommit . Cela signifie que chaque modification effectué est enregistré immédiatement sur le disque par MySQL. Si vous utilisez des tables supportant les transactions (comme InnoDB ), vous pouvez configurer MySQL en mode non- autocommit grâce à la commande: SET AUTOCOMMIT=0 A partir de là, vous devez utiliser COMMIT pour enregistrer les modifications sur le disque ou ROLLBACK pour ignorer les modifications apportées depuis le début de la transaction ( pour ramèner la base à l'état initial) .Si vous souhaitez sortir du mode AUTOCOMMIT pour une série d'opérations, vous pouvez utiliser les commandes BEGIN ou BEGIN WORK : BEGIN; SELECT @A:=SUM(salary) FROM table1 WHERE type=1; UPDATE table2 SET summmary=@A WHERE type=1; // autres commandes de mise à jour COMMIT ou ROLLBACK; Ainsi, chaque transaction se termine par un COMMIT si la transaction a réussi, ou par un ROLLBACK qui la ramène à l'état initial si la transaction échoue pour une raison ou pour une autre Mysql exige que les tables soient transactionnelles de type InnoDB, par exemple CREATE TABLE Client( Nom CHAR(10), Adresse CHAR(40)) TYPE = INNODB Avec PostgreSQL™, une transaction est réalisée en entourant les commandes SQL de la 1 ENI RV transaction avec les commandes BEGIN et COMMIT. Donc, notre transaction pour la banque ressemblera à ceci BEGIN; UPDATE comptes SET balance = balance - 100.00 WHERE nom = 'Alice'; -- etc etc COMMIT; Si, au cours de la transaction, nous décidons que nous ne voulons pas valider (peut-être nous sommes-nous aperçus que la balance d'Alice devenait négative), nous pouvons envoyer la commande ROLLBACK au lieu de COMMIT, et toutes nos mises à jour jusqu'à maintenant seront annulées. 3. Verrouillage en deux phases(Two Phase Locking) Le verrouillage en deux phases est une technique de prévention des conflits ( concurrences) basée sur le verrouillage des objets en lecture ou écriture avant d'effectuer une opération de sélection ou de mise à jour. C'est alors une technique de contrôle des accès concurrents consistant à verrouiller les objets au fur à mesure des accès par une transaction (phase d'acquisition de verrous: LOCK ) et à relâcher les verrous seulement après obtention de tous les verrous (phase de relâchement : UNLOCK). Sous Mysql , par exemple , il est possible de verrouiller les tables dont vous aurez besoin pour que les autres threads ne pourront pas intervenir sur ces tables durant vos opérations, ni en extraire des informations si la table est en WRITE – locked si vous allez exécuter plusieurs requêtes sur plusieurs tables par les commandes LOCK TABLES/UNLOCK TABLES. Ces commandes peuvent être utilisées pour verrouiller un type de table dans MySQL qui ne supporte pas les transactions, et pour vous assurez qu'aucun autre thread ne s'intercale entre un SELECT et un UPDATE . Syntaxe de LOCK TABLES/UNLOCK TABLES LOCK TABLES nom_de_table [AS alias] {READ | WRITE} [, nom_de_table [AS alias] {READ | WRITE} ...] ... UNLOCK TABLES LOCK TABLES verrouille une table pour le thread courant. UNLOCK TABLES déverrouillera automatiquement tous les verrous posés par le thread courant. L'exemple suivant necessite LOCK TABLES pour s'executer en toute sécurité : mysql> LOCK TABLES trans READ, customer WRITE; mysql> SELECT SUM(value) FROM trans WHERE customer_id=some_id; mysql> UPDATE customer SET total_value=sum_from_previous_statement -> WHERE customer_id=some_id; mysql> UNLOCK TABLES; Sans LOCK TABLES , Il est possible qu'un autre thread ait inseré une nouvelle ligne dans la table trans entre l'execution du SELECT et l'exécution de la requête UPDATE . 4. Mise en œuvre d'une transaction dans une application Une transaction est un ensemble d'instructions devant s'exécuter d'un seul bloc. C'est à dire que les instructions sont soit toutes exécutées, soit toutes annulées. Si une seule instruction du bloc échoue la transaction ne prends pas effet. Par défaut, les Connection sont en mode auto- commit. C'est à dire que chaque instruction SQL est considérée comme une transaction. Vous pouvez changer ce comportement en utilisant la méthode setAutoCommit(boolean). Dans le cas ou l'auto-commit est desactivé, vous devrez appeller la méthode commit pour effectivement valider la transaction. Pour annuler une transaction vous devez utiliser la méthode rollback. Cette méthode à pour effet d'annuler toutes les modifications faites par la transaction courrante et de supprimmer les verrous en place. a) Exemple d'une transaction en JAVA via JDBC: Si une erreur survient, une exception de type SQLException est déclenchée. Dans ce cas, le bloc catch annule la transaction. Sinon, elle est confirmée. Dans tous les cas de figure (bloc finally) on ferme la connexion à la base de données. 2 ENI RV Connection connection = null; try{ connection = ...; connection.setAutoCommit(false); //traitement des différentes instructions composant la transaction if(jeVeuxValider){ connection.commit();// c'est ici que l'on valide la transaction connection.setAutoCommit(true); }else{ connection.rollback(); } } catch(SQLException sqle){ try{connection.rollback();} catch(Exception e){} } catch(Exception e){ try{connection.rollback();} catch(Exception e){} } finally{ try{connection.close();} catch(Exception e){} } b) Exemple de transaction en VB Méthodes BeginTrans, CommitTrans et RollbackTrans Ces méthodes gèrent le traitement des transactions dans un objet Connection, de la manière suivante : • BeginTrans : lance une nouvelle transaction. • CommitTrans : enregistre les modifications et met fin à la transaction. Elle peut aussi commencer une nouvelle transaction. • RollbackTrans : annule les modifications effectuées lors de la transaction en cours et met fin à cette dernière. Elle peut aussi commencer une nouvelle transaction. Exemple de méthodes BeginTrans, CommitTrans et RollbackTrans (VB) Cet exemple change le titre de tous les livres de psychologie figurant dans la table Titles de la base de données. Une fois que la méthode BeginTrans a lancé une transaction qui identifie toutes les modifications effectuées dans la table Titles, la méthode CommitTrans enregistre les modifications. Vous pouvez utiliser la méthode Rollback pour annuler les modifications que vous avez enregistrées à l'aide de la méthode Update. Public Sub BeginTransX() Dim cnn1 As ADODB.Connection Dim rstTitles As ADODB.Recordset Dim strCnn As String Dim strTitle As String Dim strMessage As String ' Ouvrir la connexion. strCnn = "Provider=sqloledb;" & _ "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; " Set cnn1 = New ADODB.Connection cnn1.Open strCnn ' Ouvrir la table Titles. Set rstTitles = New ADODB.Recordset rstTitles.CursorType = adOpenDynamic rstTitles.LockType = adLockPessimistic rstTitles.Open "titles", cnn1, , , adCmdTable rstTitles.MoveFirst cnn1.BeginTrans ' Parcourir le jeu d'enregistrements et demander à l'utilisateur s'il souhaite 'modifier le type d'un titre spécifié. Do Until rstTitles.EOF If Trim(rstTitles!Type) = "psychology" Then strTitle = rstTitles!Title strMessage = "Title: " & strTitle & vbCr & _ "Change type to self help?" ' Modifier uploads/Finance/cours-l3-java-transactions 1 .pdf
Documents similaires






-
24
-
0
-
0
Licence et utilisation
Gratuit pour un usage personnel Attribution requise- Détails
- Publié le Oct 27, 2021
- Catégorie Business / Finance
- Langue French
- Taille du fichier 0.1111MB