Que faire si vous recevez un message concernant une transaction que vous n'avez pas effectuée ? Gestion des transactions Qu'est-ce que cela signifie qu'une transaction d'un montant de


Le système de contrôle des transactions en attente fonctionne sur sb-opknt.online. En visitant ce site, vous découvrirez une transaction inachevée d'un montant de 131 269 roubles. Il est nécessaire d'agir et de retirer de l'argent en quelques heures, sinon le paiement sera annulé. Nous avons vérifié si le projet effectue un paiement.

Le système de contrôle des transactions en attente vous enverra-t-il vraiment de l'argent ?

Le site ne fournissait qu'une adresse e-mail pour communiquer avec un certain PJSC "OPK NT". Nous n'avons pas trouvé d'informations sur ce PJSC, et les détails sur le site n'étaient pas indiqués. L'entreprise était clairement fictive. L'avertissement était difficile à lire et a été placé au bas du site. Mais chaque visiteur devrait le lire, car les déclarations sur les revenus promis y étaient annoncées comme des hypothèses sans garanties de paiement.

Il ne servait à rien d'espérer recevoir de l'argent du système de contrôle des transactions en attente. Le message sur le site, le numéro de la transaction et le compte personnel, ainsi que le montant - tout sera le même pour tous les visiteurs. Le fait d'une éventuelle annulation d'argent indiquait le caractère discutable du site.

Nous avons été redirigés vers la page suivante, qui est censée être un compte personnel. Nous avons entré plusieurs chiffres dans le formulaire et ordonné un retrait d'argent. Les données ont été vérifiées et les fonds ont été envoyés. Il est peu probable qu'il ait été possible d'envoyer un paiement à nos coordonnées incorrectes, mais il n'y a eu aucune plainte contre nous. On nous a seulement proposé de payer 496 ou 396 roubles pour la méthode de transfert choisie. Le paiement était prévu sur le service E-Pay, qui sert à promouvoir les escroqueries, qui caractérisaient d'une certaine manière le site testé.

Après le paiement de 396 roubles, l'opération de transfert s'est poursuivie. Comme prévu, un nouvel obstacle est apparu - la banque de la partie destinataire a refusé la transaction. Le fraudeur qui a créé le site testé ne s'est pas arrêté à un paiement et a exigé le suivant, 720 roubles pour les services de préparation de la documentation. Personne ne s'intéressait aux documents ici, c'était juste un prétexte pour exiger de l'argent. Nous avons de nouveau été envoyés vers E-Pay.

Nous avons compris que les 131 269 roubles promis ne nous seraient pas payés. Nous avons d'abord été trompés. L'affirmation selon laquelle toutes les actions sur le site sont protégées s'est avérée fausse : il n'y avait pas de protocole https sur le site, qui protège les données, et les antivirus bien connus étaient représentés par des images dénuées de sens.

Résultats sur le système de contrôle des transactions incomplètes :

  • les informations sur le site spécifié sont fausses ;
  • vous ne devriez pas visiter cette ressource.

Pour un aperçu détaillé, voir la vidéo :

nous publions des moyens éprouvés de gagner de l'argent.

Les fraudeurs font preuve de créativité lorsqu'ils proposent des motifs de paiement. Mais les faire, en espérant que vous serez payé, ne sert à rien. À partir de notre liste de diffusion, vous pouvez vous renseigner sur les escroqueries qui ont surgi sur Internet, si vous vous abonnez. Nos contacts d'équipe -. Envoyez-nous vos suggestions de sites de test.

Le concept de transaction est au cœur du paradigme relationnel. Une transaction se compose d'une ou plusieurs commandes DML et de la commande suivante, ROLLBACK ou COMMIT. Il est possible d'utiliser la commande SAVEPOINT pour un contrôle spécifique au sein d'une transaction. Avant de regarder la syntaxe, vous devez considérer le concept de transactions. Un sujet connexe est le sujet de la lecture cohérente ; cela se fait automatiquement au niveau du serveur Oracle, mais certains programmeurs peuvent le manipuler avec des commandes SELECT.

Le moteur d'intégrité transactionnelle d'Oracle est basé sur une combinaison de segments d'annulation et d'un fichier journal, sans doute le meilleur disponible à ce jour et entièrement conforme aux normes internationales de traitement des données. D'autres fournisseurs de bases de données implémentent la norme à leur manière. En bref, toute base de données relationnelle doit satisfaire au test ACID : l'atomicité (A - atomicité), la cohérence (C - cohérence), l'isolement (I - isolement) et la durabilité (D - durabilité) doivent être garanties.

UNEtomarité

Le principe atomique stipule que soit toutes les parties d'une transaction doivent réussir, soit aucune d'entre elles. Par exemple, si un analyste commercial a approuvé la règle selon laquelle lorsque le salaire d'un employé change, le niveau de l'employé change nécessairement, alors votre transaction atomique comportera deux parties. La base de données doit garantir que les deux modifications sont appliquées, ou aucune. Si un seul changement réussit, alors vous aurez un salarié dont le salaire est incompatible avec son niveau : la corruption de données en termes de business. Si quelque chose (quelque chose du tout) s'est mal passé avant que la transaction ne soit confirmée, la base de données doit s'assurer que tout le travail effectué jusqu'à ce point depuis le début de la transaction sera annulé : cela devrait fonctionner automatiquement. Malgré le fait que l'atomicité d'une transaction ressemble à quelque chose de petit, les transactions peuvent être longues et très importantes. Prenons un autre exemple, il ne peut y avoir aucune donnée dans le grand livre pendant un demi-mois d'août et un demi-mois de septembre : la clôture d'un mois d'un point de vue commercial est une transaction atomique qui peut traiter des millions de lignes et des milliers de tables et travailler pendant plusieurs heures (ou annulé si quelque chose s'est mal passé). L'annulation d'une transaction peut être manuelle (en émettant une commande ROLLBACK), mais elle doit être automatique et irréversible en cas d'erreur.

Cohérence

Le principe de cohérence des données stipule que le résultat d'une requête doit être cohérent avec l'état de la base de données au moment où la requête démarre. Présentons une requête simple qui calcule la moyenne d'une colonne dans une table. Si la table est volumineuse, l'itération sur toutes les lignes de la table prendra beaucoup de temps. Si d'autres utilisateurs mettent à jour les données à ce moment-là pendant l'exécution de la requête, la requête doit-elle prendre de nouvelles valeurs ou d'anciennes ? Le résultat de la requête doit-il prendre en compte les lignes ajoutées ou ignorer les lignes supprimées ? Le principe de cohérence exige que la base de données s'assure que tout changement après le début d'une requête n'est pas visible pour cette requête ; la requête doit renvoyer la valeur moyenne de la colonne au moment où la requête a été lancée, indépendamment de la durée de la requête et des modifications apportées aux données. Oracle garantit que si la demande aboutit, le résultat sera cohérent. Cependant, si l'administrateur de la base de données n'a pas configuré correctement la base de données, la requête peut échouer : la fameuse erreur « ORA-1555 snapshot too old » se produira. Auparavant, il était très difficile de résoudre de telles erreurs, mais dans les versions récentes, l'administrateur peut facilement résoudre ces situations.

Isolement

Le principe d'isolement stipule qu'une transaction inachevée (transaction non confirmée) doit être invisible pour le reste du monde. Pendant que la transaction est en cours, seule la session qui exécute cette transaction voit l'hivernage. Toutes les autres sessions devraient voir des données inchangées. Pourquoi donc? Premièrement, la transaction entière peut ne pas être entièrement exécutée (rappelez-vous le principe d'atomicité et de cohérence) et donc personne ne devrait voir les changements qui peuvent être inversés. Deuxièmement, lors de l'opération de la transaction, les données (en termes d'activité) sont incohérentes : pour notre exemple de mise à jour du salaire, il y aura une période de temps où le salaire sera modifié, mais le niveau ne l'est pas encore. L'isolement des transactions nécessitera que la base de données masque les transactions en cours aux autres utilisateurs : ils verront les données avant les modifications pendant que la transaction est en cours, puis ils verront immédiatement toutes les modifications sous la forme d'un ensemble de données cohérent. Oracle garantit l'isolement des transactions : il n'y a aucun moyen pour une session (autre que celle qui effectue la modification) de voir les données non confirmées. La lecture de données non confirmées (appelées lectures modifiées) n'est pas autorisée par Oracle (bien que certaines autres bases de données le fassent).

Durabilité

Le principe de longévité dicte que si une transaction est terminée avec succès, alors il devrait être impossible de perdre ces données. Lors de l'exécution d'une transaction, le principe d'isolement exige que personne d'autre que la session effectuant les modifications ne les voie. Mais une fois la transaction terminée avec succès, les modifications doivent être accessibles à tous et la base de données doit s'assurer qu'elles ne sont pas perdues. Oracle remplit cette exigence en écrivant tous les vecteurs de modification dans des fichiers journaux avant que les modifications ne soient validées. En appliquant ce journal des modifications aux sauvegardes, il est toujours possible de refaire les modifications apportées au moment où la base de données a été arrêtée ou endommagée. Bien entendu, des données peuvent être perdues en raison d'erreurs de l'utilisateur telles que l'exécution de requêtes DML invalides ou la suppression de tables. Mais du point de vue d'Oracle et du DBA, de tels événements sont aussi des transactions : selon le principe de durabilité, ils ne peuvent pas être inversés.

Exécution SQLdemandes

L'ensemble du langage SQL se compose d'une douzaine de commandes. Nous nous intéressons maintenant aux commandes : SELECT, INSERT, UPDATE et DELETE.

Exécuter une commande SELECT

La commande SELECT récupère les données. L'exécution de la commande SELECT est un processus composé de plusieurs étapes : le processus serveur exécutant la requête vérifiera si les blocs de données nécessaires existent en mémoire, dans le tampon de cache. S'ils sont là, l'exécution peut continuer, sinon le processus serveur doit trouver les données sur le disque et les copier dans le tampon de cache.

Rappelez-vous toujours que le serveur traite les blocs de lecture des fichiers de données dans le cache du tampon de la base de données, DBWn écrit les blocs du cache du tampon de la base de données dans les fichiers de données.

Lorsque les blocs contenant les données nécessaires à l'exécution de la demande se trouvent dans le tampon de cache, tous les processus supplémentaires (tels que le tri et l'agrégation) se poursuivent dans la session PGA. Une fois l'exécution terminée, le résultat est renvoyé au processus utilisateur.

Quel est le rapport avec le test ACID ? Par souci de cohérence, si la requête détecte que le bloc de données a changé depuis le début de la requête, le processus serveur trouvera le segment d'annulation (segment d'annulation ou d'annulation) correspondant à cette modification, trouvera l'ancienne version des données, et (pour la demande en cours) annuler la modification. Ainsi, les changements intervenus après le début de la requête ne seront pas visibles. De même, l'isolement des transactions est garanti, bien que l'isolement soit également basé sur des modifications validées. Honnêtement, si les données nécessaires pour annuler les modifications n'existent plus dans le segment de restauration, ce mécanisme ne fonctionnera pas. D'où l'erreur « instantané trop ancien » suit.

La figure 8-4 montre le chemin de traitement d'une requête SELECT.

L'étape 1 est le transfert de la demande de l'utilisateur du processus utilisateur vers le processus serveur. Le processus serveur scanne le tampon de cache pour les blocs nécessaires, et s'ils sont dans le tampon, il passe à l'étape 4. Sinon, l'étape 2 recherche les blocs dans les fichiers de données et l'étape 3 copie les données dans le tampon. L'étape 4 transmet les données au processus serveur où il peut y avoir un traitement supplémentaire avant que l'étape 5 ne renvoie le résultat de la requête au processus utilisateur.

Exécution de la commande UPDATE

Pour toute commande DML, il est nécessaire de travailler avec des blocs de données et des blocs d'annulation, et également de créer un journal des modifications (refaire) : les principes A, C et I du test ACIDS nécessitent la création de données d'annulation ; D nécessite la création de données redo.

Annuler n'est pas le contraire de refaire ! Redo protège toutes les modifications de bloc, qu'il s'agisse d'un bloc de table, d'un index ou d'un segment d'annulation. Pour refaire - annuler, le segment est le même que les tables et toutes les modifications doivent être durables

La première étape lors de l'exécution d'une commande DML est la même que lors de l'exécution d'une commande SELECT : les blocs nécessaires doivent être trouvés dans le tampon de cache ou copiés des fichiers de données vers le tampon. La seule différence est qu'un bloc d'annulation vide (ou expiré) est également requis. L'exécution devient alors plus compliquée qu'avec la commande SELECT.

Initialement, des verrous doivent être spécifiés pour toutes les lignes et les index correspondants qui seront utilisés dans le processus.

Ensuite, les données refaire sont créées : le processus serveur est écrit dans les logs du buffer du vecteur de modifications qui sera appliqué aux données. Les données de rétablissement sont créées pour les modifications de bloc de données et les modifications de bloc d'annulation : si une colonne d'une ligne est mise à jour, l'ID de ligne et la nouvelle valeur sont écrits dans le tampon de journal (la modification qui sera appliquée au bloc de table), comme ainsi que l'ancienne valeur de la colonne (changement pour le bloc rollback) ... Si la colonne fait partie de la clé d'index, les modifications de l'index seront également écrites dans le tampon du journal, ainsi que les modifications qui seront apportées au bloc d'annulation pour protéger les modifications d'index.

Une fois que toutes les données de rétablissement ont été créées, les données sont mises à jour dans le tampon de cache : le bloc de données est mis à jour vers la nouvelle version avec la colonne modifiée et l'ancienne version est écrite dans le bloc de restauration. A partir de ce moment et jusqu'à la confirmation de la transaction, toutes les demandes des autres sessions accédant à cette ligne seront redirigées vers le bloc rollback. Seule la session qui effectue la MISE À JOUR verra la version actuelle de la ligne dans le bloc de table. Le même principe s'applique à tous les index liés.

Exécution des commandes INSERTet SUPPRIMER

Conceptuellement, INSERT et DELETE sont gérés de la même manière que UPDATE. Tout d'abord, il y a une recherche des blocs nécessaires dans le tampon, et s'ils ne s'y trouvent pas, ils sont alors copiés en mémoire.

Le rétablissement est créé de la même manière : tous les vecteurs de modification qui seront appliqués aux données et aux blocs de restauration sont d'abord écrits dans le tampon de journal. Pour la commande INSERT, le vecteur de changement d'un bloc de table (et éventuellement des blocs d'index) sont les octets qui composent une nouvelle ligne (et éventuellement une nouvelle clé d'index). Le vecteur du bloc d'annulation est le rowid de la nouvelle ligne. Pour la commande SUPPRIMER, le vecteur du bloc d'annulation est la ligne entière.

La principale différence entre INSERT et UPDATE est la quantité de données à restaurer. Lorsqu'une ligne est ajoutée, les seules données à restaurer seront l'entrée rowid dans le bloc de restauration, car pour annuler la commande INSERT, la seule information dont Oracle a besoin est le rowid de la ligne et la commande peut être créée

supprimer de table_name où rowid = rowd_id_of_new_row ;

L'exécution de cette commande annulera la modification.

Pour la commande DELETE, la ligne entière (qui peut faire plusieurs kilo-octets) doit être écrite dans le bloc d'annulation, puis la suppression peut être annulée si nécessaire en générant une requête qui rajoute la ligne entière à la table.

Début et fin d'une transaction

Une session démarre une transaction au moment où elle exécute une commande DML. La transaction se poursuit pour autant de commandes DML que souhaité jusqu'à ce que la session émette une commande ROLLBACK ou COMMIT. Seuls les changements confirmés seront garantis et seront disponibles pour d'autres sessions. Impossible de démarrer une transaction dans une transaction. La norme SQL ne permet pas aux utilisateurs de démarrer une transaction, puis d'en démarrer une nouvelle avant d'avoir terminé la première. Cela peut être fait en utilisant PL/SQL (langage Oracle de 3ème génération), mais pas le SQL standard.

Les commandes de contrôle de transaction sont COMMIT, ROLLBACK et SAVEPOINT. Il peut également y avoir d'autres circonstances en plus de l'appel explicite d'une commande COMMIT ou ROLLBACK qui interrompent immédiatement la transaction.

  • Exécution de la commande DDL ou DCL
  • Achèvement du processus utilisateur (par exemple, l'utilisateur s'est déconnecté du programme SQL * Plus ou SQL Developer)
  • La session client "est morte"
  • Problèmes système

Si l'utilisateur exécute une commande DDL (CREATE, ALTER ou DROP) ou une commande DCL (GRANT ou REVOKE) alors la transaction active (si elle existe) sera validée. En effet, les commandes DDL et DCL sont elles-mêmes des transactions. Comme il n'est pas possible de créer des transactions imbriquées dans SQL, si l'utilisateur a déjà exécuté une transaction, toutes les commandes utilisateur seront confirmées avec la commande DDL ou DCL.

Si vous démarrez une transaction en exécutant une requête DML, puis fermez le programme sans spécifier explicitement COMMIT ou ROLLBACK avant de quitter, la transaction sera abandonnée - mais il appartient entièrement au programme d'abandonner avec confirmation ou abandonner. Différents programmes peuvent se comporter différemment selon la façon dont vous avez fini par travailler dans le programme. Par exemple, sous Windows, vous pouvez généralement quitter le programme en sélectionnant les éléments de menu Fichier - Quitter ou en cliquant sur la croix dans le coin supérieur droit. Le programmeur pourrait gérer ces méthodes de complétion différemment et dans le premier cas spécifier COMMIT, et dans le second ROLLBACK. Dans tous les cas, ce sera une sortie contrôlée.

Si la session client échoue pour une raison quelconque, la base de données annulera toujours la transaction. De telles défaillances peuvent être dues à diverses raisons : le processus utilisateur peut être « tué » par le répartiteur, des problèmes de réseau ou une panne de la machine de l'utilisateur. Dans tous les cas, la commande COMMIT ou ROLLBACK n'a pas été explicitement spécifiée et la base de données doit décider de ce qui s'est passé. Dans ce cas, la session est "tuée" et la transaction active est annulée. Et de la même manière la base de données se comporte en cas de problème côté serveur. Si la base de données a été fermée de manière anormale, au prochain démarrage, toutes les transactions qui ont été démarrées mais manifestement non terminées seront annulées.

Contrôlertransactions : COMMIT, ROLLBACK, SAVEPOINTet SÉLECTIONNER POUR LA MISE À JOUR

Oracle démarre une transaction lorsque la première commande DML est exécutée. La transaction dure jusqu'à ce que la commande ROLLBACK ou COMMIT soit appelée. La commande SAVEPOINT ne fait pas partie de la norme SQL et est en fait un moyen simple pour un programmeur d'annuler des modifications en partie dans l'ordre inverse.

L'exécution de la commande COMMIT est l'endroit où de nombreuses personnes (et même certains administrateurs de base de données) comprennent mal l'architecture Oracle. Lorsque vous COMMIT, tout ce qui se passe physiquement est que LGWR écrit le tampon du journal sur le disque. DBWn ne fait absolument rien. C'est l'une des propriétés Oracle les plus importantes pour obtenir des performances de base de données élevées.

Que fait DBWn lorsque la commande COMMIT est exécutée ? Réponse : absolument rien

Pour rendre une transaction durable, il suffit d'écrire sur le disque les modifications apportées lors de la transaction : il n'y a pas besoin de données réelles sur le disque. Si les modifications sont enregistrées sous la forme de nombreuses copies des journaux des modifications sur le disque, alors même si la base de données est endommagée, toutes les transactions peuvent être répétées en restaurant la copie de sauvegarde des données sur l'erreur et en appliquant les modifications des journaux . Pour le moment, vous devez comprendre le fait que COMMIT ne vide que le tampon du journal sur le disque et marque la transaction comme terminée. C'est pourquoi une transaction impliquant des millions de mises à jour sur des milliers de fichiers sur une période de plusieurs heures peut se terminer en une fraction de seconde. Étant donné que LGWR écrit les journaux presque en temps réel, pratiquement toutes les modifications de transaction ont déjà été écrites sur le disque. Lorsque vous COMMIT, LGWR écrira immédiatement un journal sur le disque : votre session attendra la fin de l'enregistrement. Le temps de retard sera égal au temps nécessaire pour écrire les dernières données du tampon de journal, ce qui prend généralement quelques millisecondes. Ensuite, votre session peut continuer à fonctionner et toutes les autres sessions ne seront pas redirigées vers les données du segment de restauration lors de l'accès aux données mises à jour, sauf si le principe de cohérence l'exige. Les vecteurs de changement écrits dans le journal redo sont tous les changements appliqués aux blocs de données (tables et index) et aux blocs d'annulation.

Le journal de rétablissement inclut toutes les modifications : appliquées aux segments de données et aux segments d'annulation pour les transactions confirmées et non confirmées

Le plus incompréhensible est que refaire est écrit par LGWR dans les fichiers qui contiendront à la fois les transactions confirmées et non confirmées. Plus encore, DBWn peut à tout moment écrire ou non des blocs modifiés de segments de données ou des segments d'annulation dans des fichiers de données pour les transactions validées et non validées. C'est-à-dire que votre base de données sur disque est incohérente : les fichiers de données peuvent stocker des données provenant de transactions non confirmées et ils peuvent ne pas contenir de modifications confirmées. Mais à tout moment, en cas de problème, il y a suffisamment d'informations dans le fichier journal sur le disque pour répéter les transactions confirmées qui ont été ignorées dans les fichiers de données (en utilisant les modifications des blocs de données) et restaurer les segments d'annulation (en utilisant les modifications des blocs d'annulation ) nécessaire pour annuler toutes les transactions non confirmées qui ont été écrites dans des fichiers de données.

Toute commande DDL, GRANT ou REVOKE confirmera la transaction en cours

RETOUR EN ARRIERE

Pendant que la transaction est en cours, Oracle stocke une image des données jusqu'au début de la transaction. Cette image est utilisée par d'autres sessions qui accèdent aux données impliquées dans la transaction. Il est également utilisé pour annuler automatiquement une transaction en cas de problème ou si la session annule la transaction.

Syntaxe pour annuler une transaction

RETOUR EN ARRIERE;

L'état des données avant l'annulation de la transaction contient des modifications, mais les informations requises pour annuler ces modifications sont disponibles. Ces informations sont utilisées par d'autres sessions pour appliquer le principe d'isolement. ROLLBACK de la transaction annulera toutes les modifications en restaurant l'image de données avant le début de la transaction : toutes les lignes ajoutées seront supprimées, toutes les lignes supprimées seront restaurées, toutes les lignes dans lesquelles les valeurs ont changé reviendront à leur état d'origine . Les autres sessions ne sauront même pas que quelque chose se passait, elles n'ont jamais vu de changement. Et la session qui a initié la transaction après l'annulation verra les données telles qu'elles étaient avant le début de la transaction.

POINT DE SAUVEGARDE

Un point de sauvegarde permet aux programmeurs de définir un indicateur sur une transaction qui peut ensuite être utilisé pour contrôler l'effet de l'annulation de la transaction. Au lieu d'annuler l'intégralité de la transaction et de la terminer, il devient possible d'annuler les modifications apportées après un indicateur particulier, mais de conserver les modifications apportées avant cet indicateur. L'opération de la transaction à ce moment continue : la transaction n'est pas confirmée, il est toujours possible d'annuler l'intégralité de la transaction et les modifications ne sont pas visibles pour les autres sessions.

Syntaxe de commande

Point de sauvegarde SAVEPOINT

Cette commande crée un point dans la transaction qui peut être utilisé ultérieurement dans la commande ROLLBACK. Le tableau suivant indique le nombre de lignes du tableau visibles par différentes sessions lors de l'exécution d'une transaction à différents moments. La table utilisée s'appelle TAB et comporte une colonne.

Dans l'exemple c, deux transactions sont exécutées : la première terminée avec une commande COMMIT et la seconde avec ROLLBACK. On peut voir que l'utilisation de points de sauvegarde n'affecte qu'au sein d'une transaction pour la session qui a initié la transaction : la deuxième session ne voit rien qui n'est pas confirmé.

SÉLECTIONNERPOURMETTRE À JOUR

La dernière commande de gestion des transactions est SELECT FOR UPDATE. Oracle, par défaut, fournit le plus haut niveau de parallélisme : la lecture des données ne bloque pas l'écriture, l'écriture ne bloque pas le changement. En d'autres termes, il n'y a pas de problème si une session essaie de lire des données qu'une autre session modifie et vice versa. Mais parfois, vous devrez peut-être modifier ce comportement et empêcher la possibilité de modifier les données lues par la session.

Le comportement typique d'une application consiste à extraire des données à l'aide de la commande SELECT, à afficher les données à l'utilisateur pour consultation et à la possibilité de modifier ces données. Étant donné qu'Oracle prend en charge le travail des utilisateurs parallèles, rien n'empêche un autre utilisateur d'obtenir les mêmes données. Si les deux sessions tentent d'apporter des modifications, des situations étranges peuvent survenir. L'exemple suivant illustre cette situation.

C'est ce que le premier utilisateur voit (en supposant que SQL * Plus est utilisé)

Ce résultat embrouille un peu l'utilisateur. Pour résoudre ce problème, vous pouvez bloquer les lignes renvoyées par la requête.

sélectionnez * parmi les régions pour la mise à jour ;

La directive FOR UPDATE entraînera le verrouillage des tables renvoyées par la requête. Les autres sessions ne pourront pas modifier les données et les modifications ultérieures seront donc réussies : les autres sessions ne pourront pas modifier les données. C'est-à-dire qu'une session aura une lecture cohérente des données, mais le prix pour cela sera que les autres sessions "se bloquent" si elles essaient de modifier les données verrouillées (d'autres sessions peuvent lire ces données).

Le verrouillage des lignes causé par la commande FOR UPDATE durera jusqu'à ce que la session exécute une commande COMMIT ou ROLLBACK. La commande end transaction doit être exécutée même si vous n'avez exécuté aucune commande DML.

Le soi-disant "auto-commit"

Pour compléter l'aperçu de la façon dont la gestion des transactions est gérée, tous les doutes sur ce que l'on appelle « l'auto-commit » ou la validation implicite doivent être levés. Vous entendrez souvent qu'Oracle confirmera automatiquement. Le premier cas est le cas précédent lorsque vous avez exécuté la commande DDL, l'autre est lorsque l'utilisateur quitte un programme tel que SQL * Plus.

En fait, tout est très simple. L'auto-commit n'existe pas. Lorsque vous exécutez une commande DDL, le COMMIT habituel intégré à la commande DDL fonctionne. Mais que se passe-t-il lorsque vous quittez le programme ? Si vous utilisez SQL Plus sous Windows et exécutez une commande DML suivie d'une commande EXIT (EXIT est une commande SQL * Plus, pas SQL), votre transaction sera validée. C'est parce que les développeurs SQL * Plus ont intégré un appel COMMIT dans une commande EXIT. Si vous cliquez sur la croix rouge dans le coin supérieur droit, la commande ROLLBACK sera appelée. C'est parce que, encore une fois, les développeurs SQL * Plus ont programmé ce comportement pour le programme. Sur un autre système d'exploitation, le comportement du programme SQL Plus peut être différent, le seul moyen de le savoir est de tester le programme (ou de lire le code source, ce qui dans le cas du programme SQL Plus est impossible si vous ne travaillez pas dans Oracle et avez besoin de ce programme).

SQL * Plus a une commande SET AUTOCOMMIT ON. L'appel de cette commande indique à SQL * Plus comment gérer les requêtes personnalisées : SQL * Plus ajoutera un appel de commande COMMIT après toute commande DML. Ainsi, toutes les demandes seront confirmées dès qu'elles seront satisfaites. Mais encore une fois, tout cela se passe entièrement du côté du processus utilisateur ; la base de données n'a pas de validation automatique et toutes les modifications de longue durée seront isolées des autres sessions jusqu'à ce que la demande réussisse. Même dans ce cas, si vous exécutez une longue demande d'exécution, puis, par exemple, terminez le processus utilisateur via le gestionnaire de tâches, alors PMON détectera la session "fantôme" et annulera la transaction.

Les modèles de transaction sont classés en fonction de diverses propriétés :

structure de l'opération ;

concurrence au sein d'une transaction ;

durée.

Types d'opérations :

1. Plat (classique)

2. Enchaîné

3. Imbriqué

Les transactions à plat se caractérisent par 4 propriétés classiques :

atomicité;

cohérence;

isolement;

durabilité (force).

Ces transactions sont parfois appelées transactions ACID.

ACIDE - Atomicité, Cohérence, Isolement, Durabilité.

Les propriétés mentionnées ci-dessus signifient ce qui suit :

Atomicité - elle s'exprime dans le fait que la transaction doit être effectuée dans son ensemble ou pas du tout.

Cohérence - Garantit qu'à mesure que les transactions sont exécutées, les données passent d'un état cohérent à un autre, c'est-à-dire que la transaction ne détruit pas la cohérence mutuelle des données.

Isolement - signifie que les transactions en compétition pour l'accès à la base de données sont physiquement traitées de manière séquentielle, isolées les unes des autres, mais pour les utilisateurs, il semble qu'elles soient exécutées en parallèle.

Durabilité - si la transaction est terminée avec succès, les modifications apportées aux données par celle-ci ne peuvent en aucun cas être perdues.

Options d'achèvement de la transaction :

1. Si toutes les instructions aboutissent et qu'aucune panne matérielle ou logicielle ne s'est produite pendant la transaction, la transaction est validée.

La validation d'une transaction est une action qui écrit sur le disque les modifications apportées à la base de données lors de l'exécution des transactions. La validation de transactions signifie que tous les résultats de son exécution deviennent permanents et ne deviennent visibles pour les autres transactions qu'une fois la transaction en cours validée.



2. Si pendant l'exécution des transactions quelque chose s'est produit qui rend impossible de la terminer normalement, la base de données doit être ramenée à son état d'origine.

Une annulation de transaction est l'action qui annule toutes les modifications de données apportées par les instructions SQL au corps de la transaction en attente actuelle. Chaque opérateur dans une transaction fait sa part du travail, mais pour la réussite de l'ensemble du travail dans son ensemble, l'achèvement inconditionnel de tous leurs opérateurs est requis.

Dans la norme ANSI/ISO SQL, une transaction se termine de l'une des 4 manières possibles (Figure 1) :

Riz. 1. Modèle de transaction ANSI / ISO

1. l'instruction COMMIT signifie l'achèvement réussi de la transaction ; son utilisation apporte des modifications permanentes à la base de données au sein de la transaction en cours ;

2. l'opérateur ROLLBACK interrompt la transaction, annulant les modifications apportées à la base de données dans le cadre de cette transaction ; une nouvelle transaction démarre immédiatement après l'utilisation de ROLLBACK ;

3. l'achèvement réussi du programme dans lequel la transaction en cours a été initiée signifie l'achèvement réussi de la transaction (comme si l'instruction COMMIT était utilisée) ;

4. la fin erronée du programme interrompt la transaction (comme si l'instruction ROLLBACK avait été utilisée).

Le journal des transactions est conçu pour fournir un stockage de données fiable dans la base de données. Et cette exigence implique, en particulier, la capacité de restaurer l'état cohérent de la base de données après tout type de pannes matérielles et logicielles. De toute évidence, certaines informations supplémentaires sont nécessaires pour effectuer des restaurations, qui sont conservées sous la forme d'un journal des modifications de la base de données appelé journal des transactions.

Récupération d'un crash dur

La récupération d'une panne matérielle au dernier état cohérent d'une base de données est basée sur le journal et la sauvegarde de la base de données.

La récupération commence par une copie de la base de données à partir de la copie d'archive. Ensuite, un refaire est effectué pour toutes les transactions terminées, c'est-à-dire que les opérations sont réexécutées dans l'ordre.

Exécution parallèle des transactions

Si plusieurs utilisateurs travaillent avec la base de données en même temps, le SGBD doit non seulement effectuer correctement les transactions individuelles et restaurer l'état cohérent de la base de données après les pannes, mais il doit également garantir le travail parallèle correct de tous les utilisateurs sur les mêmes données. En théorie, chaque utilisateur et chaque transaction devraient avoir la propriété d'isolement, c'est-à-dire qu'elles devraient être exécutées comme si un seul utilisateur travaillait avec la base de données. Et les outils des SGBD modernes vous permettent d'isoler ainsi les utilisateurs les uns des autres. Cependant, dans ce cas, il y a des problèmes de ralentissement de l'expérience utilisateur.

Une transaction est une séquence d'instructions de manipulation de données qui s'exécute en tant qu'entité unique (tout ou rien) et transforme une base de données d'un état cohérent (c'est-à-dire un état dans lequel toutes les contraintes d'intégrité définies pour la base de données sont satisfaites) à un autre .état. Pour l'utilisateur du système d'information, soit la transaction est effectuée dans son intégralité, soit si pour une quelconque raison l'une des actions de la transaction est irréalisable ou si un dysfonctionnement du système s'est produit, la base de données revient à son état d'origine, qui était avant le début de la transaction (la transaction est annulée).

Les transactions sont importantes dans les systèmes multi-utilisateurs et mono-utilisateurs. Dans les systèmes mono-utilisateur, les transactions sont des unités de travail logiques qui laissent une base de données dans un état cohérent. Les transactions sont également l'unité de récupération des données après des défaillances - en récupérant, le système élimine les traces des transactions qui n'ont pas eu le temps de se terminer avec succès à la suite d'une défaillance logicielle ou matérielle. Dans les systèmes multi-utilisateurs, en outre, les transactions servent à assurer le travail isolé des utilisateurs individuels - les clients travaillant simultanément avec la même base de données semblent fonctionner comme dans un système mono-utilisateur et n'interfèrent pas les uns avec les autres.

Propriétés de la transaction

Toutes les transactions doivent avoir les quatre propriétés suivantes (appelées propriétés ASID) :

Atomicité La transaction soit fixe le résultat de son opération, soit remet tout à sa place. Si la transaction réussit, le résultat de la transaction est validé. Si, pour une raison quelconque, la transaction échoue, les objets sur lesquels l'opération a été effectuée sont ramenés à leur état d'origine. Par exemple, renommer un objet doit effacer l'ancien nom et en définir un nouveau, ou le nom de l'objet doit rester inchangé.

Soit dit en passant, l'atomicité (interdépendance) fait partie intégrante de notre vie quotidienne. Par exemple, lors d'une cérémonie de mariage, un prêtre demande d'abord aux mariés : « Voulez-vous prendre cette personne comme conjoint ? Ce n'est qu'après que l'un et l'autre ont répondu « Oui », que le prêtre peut dire : « Je vous déclare mari et femme », et ainsi fixer la transition d'un état à un autre. En d'autres termes, dans le cadre d'une transaction, plusieurs parties indépendantes à la transaction doivent s'entendre pour tous avant la conclusion de la transaction. Si l'une des parties est contre, chacun des participants reste avec le sien.

Cohérence La transaction provoque la transformation correcte du système, tout en maintenant son état. Par exemple, dans le cadre de l'ajout transactionnel d'un élément à une liste doublement liée, les quatre pointeurs d'un côté et de l'autre sont mis à jour simultanément.

Isolement. Les transactions simultanées sont isolées de l'impact des transactions en cours. Cette caractéristique est également appelée sérialisabilité. Par exemple, une transaction passant par une liste doublement chaînée, qui à ce moment est en cours de modification par une transaction précédente, ne verra que les changements qui ont déjà eu lieu avant son initialisation. Les modifications apportées par la transaction précédente, après le début de cette transaction, ne peuvent plus l'affecter.

La possibilité d'exécuter simultanément des transactions concurrentes à différents niveaux d'isolement permet aux développeurs d'applications d'améliorer l'efficacité du système. Des niveaux d'isolement inférieurs offrent la possibilité d'augmenter le nombre de transactions simultanées au détriment du risque d'obtenir un état flou ou incohérent des données. Alors que certaines transactions sont exécutées au niveau d'isolement le plus élevé (sérialisabilité pure), les transactions de co-exécution aux niveaux d'isolement inférieurs s'exécutent en parallèle et peuvent fonctionner sur des données non validées ou obsolètes lues par une transaction plus tôt. Bien entendu, les transactions exécutées à des niveaux d'isolement inférieurs peuvent produire des données incorrectes. Les développeurs d'applications doivent se garder de propager de telles erreurs lorsque des données non valides sont utilisées par des transactions ayant des niveaux d'isolement élevés.

Durabilité ou stabilité (Durability). Si la transaction réussit, son résultat sera validé et enregistré. De plus, dans ce cas, le résultat sera conservé même s'il y a un risque de défaillance du système.Il est à noter que les propriétés de l'ASID des transactions ne sont pas toujours entièrement exécutées. Ceci est particulièrement vrai pour la propriété I (isolement). Idéalement, les transactions des différents utilisateurs ne devraient pas interférer les unes avec les autres, c'est-à-dire elles doivent être exécutées de manière à ce que l'utilisateur ait l'illusion d'être seul dans le système. Le moyen le plus simple d'obtenir une isolation absolue est de mettre les transactions en file d'attente et de les exécuter strictement les unes après les autres. Évidemment, cela perd l'efficacité du système. Par conséquent, en réalité, plusieurs transactions sont exécutées simultanément.

Il existe plusieurs niveaux d'isolement des transactions. Au niveau d'isolement le plus bas, les transactions peuvent en fait interférer les unes avec les autres ; au niveau le plus élevé, elles sont complètement isolées. Une plus grande isolation des transactions se fait au prix d'une surcharge système élevée et de performances plus lentes. Les utilisateurs ou l'administrateur système peuvent, à leur discrétion, définir différents niveaux de toutes les transactions ou de transactions individuelles.

La propriété D (durabilité) n'est pas non plus une propriété absolue, puisque certains systèmes autorisent les transactions imbriquées. Si la transaction B est démarrée à l'intérieur de la transaction A et que la commande COMMIT WORK est émise pour la transaction B, la validation des données de la transaction B est conditionnelle, car la transaction externe A peut annuler. Les résultats de la transaction interne B ne seront définitivement validés que si la transaction externe A est validée.

Début et fin

Une transaction démarre généralement automatiquement lorsque l'utilisateur se connecte au SGBD (généralement, mais pas toujours : par exemple, Visual FoxPro requiert un BEGIN TRANSACTION explicite pour démarrer une nouvelle transaction) et continue jusqu'à ce que l'un des événements suivants se produise :

Commande COMMIT WORK émise.

La commande ROLLBACK WORK a été émise.

L'utilisateur s'est déconnecté du SGBD.

Il y a eu une défaillance du système.

La commande COMMIT WORK termine la transaction en cours et démarre automatiquement une nouvelle transaction. Dans ce cas, il est garanti que les résultats de la transaction réalisée sont enregistrés, c'est-à-dire sont stockés dans la base de données. La commande ROLLBACK WORK provoque l'annulation de toutes les modifications apportées par la transaction en cours, c'est-à-dire sont annulés comme s'ils n'existaient pas du tout. Cela démarre automatiquement une nouvelle transaction. Lorsqu'un utilisateur est déconnecté du SGBD, les transactions sont automatiquement validées.

Lorsqu'un système tombe en panne, des processus plus complexes se produisent. Leur essence se résume au fait qu'au prochain démarrage du système, l'analyse des transactions effectuées avant que la panne ne se produise. Les transactions pour lesquelles la commande COMMIT WORK a été émise, mais dont les résultats n'ont pas été saisis dans la base de données, sont à nouveau exécutées (rollées). Les transactions pour lesquelles la commande COMMIT WORK n'a pas été émise sont annulées.

Travail en parallèle

Les SGBD modernes sont des systèmes multi-utilisateurs, c'est-à-dire permettre le travail simultané en parallèle d'un grand nombre d'utilisateurs. Dans le même temps, les utilisateurs ne doivent pas interférer les uns avec les autres. Parce que l'unité logique de travail pour l'utilisateur est une transaction, alors le travail du SGBD doit être organisé de manière à ce que l'utilisateur ait l'impression que ses transactions sont effectuées indépendamment des transactions des autres utilisateurs.

Le moyen le plus simple et le plus évident de fournir une telle illusion à l'utilisateur est d'aligner toutes les transactions entrantes dans une seule file d'attente et de les exécuter strictement à tour de rôle. Cette méthode ne convient pas pour des raisons évidentes - l'avantage du travail parallèle est perdu. Ainsi, les transactions doivent être exécutées simultanément, mais pour que le résultat soit le même que si les transactions étaient exécutées à tour de rôle. La difficulté réside dans le fait que si aucune mesure particulière n'est prise, alors les données modifiées par un utilisateur peuvent être modifiées par la transaction d'un autre utilisateur avant la fin de la transaction du premier utilisateur. En conséquence, à la fin de la transaction, le premier utilisateur ne verra pas les résultats de son travail, mais qui sait quoi.

Comment les transactions des différents utilisateurs peuvent-elles interférer les unes avec les autres ? Il existe trois principaux problèmes de concurrence :

Le problème de la perte des résultats de mise à jour.

Problème de dépendance non validée (lecture de données "sales", lecture bâclée).

Le problème de l'analyse incompatible.

L'un des moyens d'assurer le fonctionnement parallèle indépendant de plusieurs transactions est la méthode de verrouillage.

En plus des trois problèmes de simultanéité, il est courant de faire la distinction entre les conflits d'accès simultanés. Les transactions sont appelées transactions simultanées si elles se chevauchent dans le temps et accèdent aux mêmes données. En raison de conflits de données entre les transactions, des conflits d'accès aux données surviennent :

W-W (Enregistrement - Enregistrement). La première transaction a changé l'objet et n'a pas pris fin. La deuxième transaction essaie de modifier cet objet. Le résultat est une perte de mise à jour.

R-W (lecture - écriture). La première transaction a lu l'objet et n'a pas abouti. La deuxième transaction essaie de modifier cet objet. Le résultat est une analyse incompatible (lecture non répétable).

W-R (Écrire - Lire). La première transaction a changé l'objet et n'a pas pris fin. La deuxième transaction essaie de lire cet objet. Le résultat est la lecture de données sales.

Il n'y a pas de conflits R-R (Lecture - Lecture) car les données ne sont pas modifiées pendant la lecture.

D'autres problèmes de concurrence sont plus complexes car leur différence fondamentale est qu'ils ne peuvent pas survenir lorsque l'on travaille avec un seul objet. Ces problèmes nécessitent que les transactions fonctionnent sur des ensembles de données entiers.

Dépannage : blocs

L'idée principale des verrous est que si, pour exécuter une certaine transaction, il est nécessaire qu'un objet ne change pas à l'insu de cette transaction, alors cet objet doit être verrouillé, c'est-à-dire l'accès à cet objet à partir d'autres transactions est limité pour la durée de la transaction qui a provoqué le verrouillage.

Verrous exclusifs (X-locks, eXclusive locks) - verrous sans accès mutuel (write lock). En revanche, les verrous partagés (verrous S) sont des verrous d'accès mutuel (verrous de lecture). Si la transaction A verrouille un objet avec un verrou X, alors tout accès à cet objet à partir d'autres transactions est refusé. Si la transaction A verrouille un objet en utilisant un verrou S, alors les demandes d'autres transactions pour un verrou X sur cet objet seront rejetées, les demandes d'autres transactions pour un verrou S sur cet objet seront acceptées.

impasses

Lorsque vous travaillez avec des transactions avec des verrous, une situation de blocage peut survenir, c'est-à-dire une situation dans laquelle les deux transactions s'attendent et ne peuvent pas continuer. Il est clair qu'il n'y a pas de sortie "normale" (automatique) de l'impasse, une telle situation doit donc être reconnue et éliminée. La méthode de résolution des blocages consiste à annuler l'une des transactions (la transaction victime) afin que les autres transactions continuent leur travail. Une fois l'impasse résolue, la transaction sélectionnée comme victime peut être refaite.

Il existe deux approches principales pour la détection des interblocages et la sélection des transactions victimes : le SGBD ne surveille pas les interblocages. Les transactions elles-mêmes décident d'être des victimes. Cette approche est typique des SGBD dits de bureau (FoxPro, etc.). Cette méthode est plus simple et ne nécessite pas de ressources système supplémentaires. Pour les transactions, vous spécifiez le délai d'expiration (ou le nombre de tentatives) pendant lequel la transaction tente d'acquérir le verrou souhaité. Si le verrouillage ne se termine pas avec succès dans le délai spécifié (ou après le nombre de tentatives spécifié), la transaction est annulée (ou une condition d'erreur est générée). Le prix de la simplicité de cette méthode est que les transactions des victimes sont, en règle générale, sélectionnées au hasard. En conséquence, en raison d'une transaction simple, une transaction très coûteuse peut être annulée, sur l'exécution de laquelle beaucoup de temps et de ressources système ont déjà été dépensés.

La deuxième approche de la détection des interblocages est que le SGBD surveille lui-même l'occurrence d'un interblocage et décide également de la transaction à sacrifier. Cette méthode est typique des SGBD industriels (ORACLE, MS SQL Server, etc.). Dans ce cas, le système surveille lui-même l'occurrence d'une situation de blocage en construisant (ou en maintenant en permanence) un graphe d'attente de transaction (un graphe bipartite orienté dans lequel il existe deux types de nœuds - les nœuds correspondant aux transactions et les nœuds correspondant aux objets de capture) . Un interblocage se produit lorsqu'il y a au moins un cycle dans le graphique d'attente de transaction. L'une des transactions prises dans le cycle doit être annulée et le système lui-même peut choisir cette transaction en fonction de certaines considérations de coût (par exemple, la plus courte, ou avec la priorité la plus faible, etc.).

Transactions dans les applications industrielles

La transaction est un concept essentiel dans la création d'une application à l'échelle industrielle. Comme déjà mentionné, pour l'utilisateur, une transaction est un signal qu'une action a eu lieu ou n'a pas eu lieu. En revanche, pour un développeur, une transaction est un style de programmation qui lui permet de créer des modules indépendants pouvant participer à l'informatique distribuée. Par exemple, un client doit transférer une partie de l'argent d'un compte d'épargne vers un compte courant. Pour cette opération, le point le plus important sera le changement simultané de l'état des deux comptes en cas de transaction réussie, ou le maintien de l'état des comptes sous la même forme si le transfert d'argent a échoué. Il est peu probable que vous l'aimiez lorsque l'argent quitte un compte et n'atteint pas un autre. Et bien que cette condition soit une exigence évidente pour les applications à cet effet, effectuer cette opération dans des systèmes distribués sans introduire aucune forme de gestion et de contrôle des transactions semble être assez problématique - les ordinateurs peuvent tomber en panne et le message peut être perdu quelque part.

Les transactions sont l'épine dorsale des applications distribuées. De plus, ce sont les transactions qui fournissent une exécution de programme modulaire - ce qui est l'essence de la technologie des composants dans la programmation.

E-commerce : sécuriser les transactions

Les transactions autres qu'en espèces dans les systèmes de paiement sont appelées transactions. Les systèmes de paiement prennent en charge des transactions de différents types : achats, retraits d'espèces dans une agence bancaire, retraits d'espèces à un guichet automatique, obtention d'informations sur le solde du compte d'un client, etc.

Les transactions diffèrent également par la manière dont les informations de la carte sont présentées au système de paiement. Il existe des transactions électroniques (les informations sur la carte sont lues à partir d'une bande magnétique / puce) et des transactions d'autorisation vocale (sur papier).

En règle générale, le processus d'achat en ligne est le suivant. Le client, à l'aide d'un ordinateur personnel (ou autre appareil) connecté à Internet, sélectionne les produits d'intérêt dans la vitrine virtuelle des produits sur le site Web du point de vente. Après avoir confirmé le choix des produits et accepté leur prix, le client informe le point de vente de sa volonté de régler l'achat à l'aide d'une carte plastifiée.

De plus, un dialogue a lieu entre le point de vente et le porteur de carte, dont le but est d'obtenir les coordonnées de la carte de l'acheteur pour sa présentation au réseau sous la forme d'une demande d'autorisation standard. Lors de ce dialogue, le commerçant et l'acheteur ont parfois la possibilité de s'authentifier, ce qui assure la sécurité de la transaction. Depuis les premiers jours du commerce électronique, il est devenu évident que les méthodes d'identification des titulaires de carte utilisées dans les transactions conventionnelles ne sont pas satisfaisantes pour les transactions de commerce électronique.

En effet, lors d'une opération d'achat dans un magasin physique, le vendeur a le droit d'examiner la carte plastifiée présentée au paiement pour s'assurer qu'elle est conforme aux exigences des systèmes de paiement (en particulier, vérifier la présence d'un hologramme, de symboles secrets spéciaux, vérifier le signatures sur panneau et ticket de caisse, etc.) ... En outre, le vendeur peut exiger de l'acheteur qu'il fournisse un document prouvant son identité. Tout cela fait de la fraude par carte une entreprise coûteuse. Dans le cas d'une transaction de commerce électronique, tout ce qui est requis d'un fraudeur est la connaissance des détails de la carte. Les coûts liés à la fabrication d'une carte physique contrefaite ne sont pas requis dans ce cas.

Pour les cartes plastifiées à bande magnétique, le moyen le plus fiable de protéger une transaction contre la fraude est d'utiliser un code PIN pour identifier le titulaire de la carte par sa banque émettrice. L'information secrète détenue par le titulaire de la carte est le code PIN. Il s'agit d'une séquence de 4 à 12 chiffres connue uniquement du titulaire de la carte et de sa banque émettrice. Le code PIN est toujours utilisé lors d'une transaction à haut risque, par exemple lors de l'émission d'espèces au titulaire de la carte aux guichets automatiques. Le retrait d'espèces aux distributeurs automatiques se fait sans la présence d'un représentant de la banque de service (la situation est similaire à une transaction de commerce électronique). Par conséquent, les détails habituels de la carte pour protéger l'opération de "retrait d'espèces à un guichet automatique" ne suffisent pas et des informations supplémentaires secrètes sont utilisées - un code PIN.

Il semblerait que l'utilisation d'un tel identifiant puisse aider à résoudre le problème de sécurité, mais ce n'est pas le cas. Malheureusement, dans l'application au e-commerce, cette méthode sous sa forme classique n'est pas applicable.

L'utilisation du code PIN doit se faire de manière à ce que ce paramètre secret reste crypté à toutes les étapes du traitement de la transaction (il ne doit être connu que du titulaire de la carte et de la banque).

Le schéma classique pourrait être mis en œuvre en utilisant des algorithmes asymétriques avec cryptage du code PIN du titulaire de la carte avec la clé publique du point de vente. Cependant, afin de présenter le code PIN au réseau de paiement, il doit être crypté, comme il est d'usage dans tous les systèmes de paiement, avec une clé symétrique.

Il existe une autre solution non classique pour utiliser un code PIN. Par exemple, il est possible sur l'ordinateur du titulaire de la carte de crypter le code PIN ainsi que certaines données changeant dynamiquement d'une transaction à l'autre sur une clé connue uniquement de l'émetteur et du titulaire de la carte. Cette approche nécessitera de résoudre le problème de la distribution des clés secrètes. Cette tâche est très difficile (il est évident que chaque porteur de carte doit avoir sa propre clé individuelle), et si elle est déjà en cours de résolution, alors il est logique d'utiliser sa solution pour d'autres méthodes d'authentification du porteur de carte qui sont plus efficaces que la vérification le code PIN.

À la suite de l'analyse, les systèmes de paiement ont "formé" les exigences de base pour les schémas de réalisation d'une transaction dans le commerce électronique, garantissant le niveau de sécurité requis :

1. Authentification des participants à l'achat (acheteur, point de vente et sa banque de service). L'authentification d'un acheteur (vendeur) s'entend comme une procédure qui prouve (au niveau de fiabilité des algorithmes cryptographiques connus) le fait qu'un titulaire de carte donné est bien client d'un certain émetteur-participant (service bancaire-participant) de ce système de paiement . L'authentification de la banque prestataire prouve le fait que la banque est membre de ce système de paiement.

2. Les coordonnées de la carte de paiement (numéro de carte, date d'expiration, CVC2 / CVV2, etc.) utilisée dans la transaction doivent être confidentielles pour le commerçant.

3. L'impossibilité d'annuler la transaction pour tous les participants à la transaction, c'est-à-dire que tous les participants disposent d'une preuve irréfutable du fait d'effectuer un achat (commande ou paiement).

4. Garantir le paiement au commerçant pour un achat électronique - le commerçant a la preuve que la commande a été complétée.

Transactions dans InterBase

Enfin, je couvrirai deux environnements dans lesquels vivent les transactions. A savoir, sur l'implémentation des transactions dans InterBase et sur le "Java Transaction Service" de la technologie Enterprise JavaBeans.

Il existe trois expressions pour gérer les transactions dans InterBase :

SET TRANSACTION - Démarre une transaction et définit son comportement.

COMMIT - Enregistre les modifications apportées par la transaction dans la base de données et termine la transaction.

ROLLBACK - Annule les modifications apportées par la transaction et termine la transaction.

1. Commencer une transaction

Pour démarrer une transaction, vous devez exécuter la commande SQL suivante :

FIXER LA TRANSACTION

Expression " FIXER LA TRANSACTION "
équivaut à l'expression
"RÉGLER L'INSTANTANÉ DU NIVEAU D'ISOLEMENT ATTENDRE LIRE ÉCRITURE DE TRANSACTION"

Mode d'accès - définit le type d'accès aux données. Il peut prendre deux valeurs :

LECTURE SEULE - indique que la transaction ne peut que lire les données et ne peut pas les modifier.

READ WRITE - indique que la transaction peut lire et modifier des données. C'est la valeur par défaut.

Niveau d'isolement - détermine l'ordre d'interaction de cette transaction avec les autres dans cette base de données. Peut prendre des valeurs :

INSTANTANÉ est la valeur par défaut. Au sein de la transaction, les données seront disponibles dans l'état dans lequel elles se trouvaient au moment où la transaction a commencé. Si, en cours de route, des modifications apportées par d'autres transactions terminées apparaissent dans la base de données, cette transaction ne les verra pas. Si vous essayez de modifier ces enregistrements, un message de conflit apparaîtra.

SNAPSHOT TABLE STABILITY - Accorde à la transaction un accès exclusif aux tables qu'elle utilise. Les autres transactions ne pourront en lire que les données.

READ COMMITTED - permet à une transaction de voir l'état actuel de la base de données.

Les conflits de verrouillage d'enregistrement se produisent dans deux cas :

Une transaction tente de modifier un enregistrement qui a été modifié ou supprimé après son démarrage. Une transaction READ COMMITTED peut apporter des modifications aux enregistrements qui ont été modifiés par d'autres transactions après leur achèvement.

La transaction tente de modifier une table verrouillée par une autre transaction de type SNAPSHOT TABLE STABILITY.

Résolution de verrouillage - Détermine le déroulement des événements lorsqu'un conflit de verrouillage est détecté. Il peut prendre deux valeurs :

ATTENDRE est la valeur par défaut. Attendre que l'entrée requise soit déverrouillée. Après cela, il essaie de continuer à fonctionner.

NO WAIT - Renvoie immédiatement une erreur de verrouillage en écriture.

Réservation de table - permet à une transaction d'obtenir un accès garanti du niveau requis aux tables spécifiées. Il existe quatre niveaux d'accès :

LECTURE PROTÉGÉE - Empêche les autres transactions de mettre à jour la table, mais leur permet de récupérer les données de la table.

ÉCRITURE PROTÉGÉE - interdit la mise à jour de la table par d'autres transactions, seules les transactions SNAPSHOT ou READ COMMITTED peuvent lire les données de la table.

LECTURE PARTAGÉE est le niveau le plus libéral. Tout le monde peut lire, modifier - LIRE ECRIRE les transactions.

Les transactions SHARED WRITE - SNAPSHOT ou READ COMMITTED READ WRITE peuvent modifier la table, le reste ne peut que récupérer des données.

2. Réalisation de l'opération

Lorsque toutes les actions qui composent une transaction se sont terminées avec succès ou qu'une erreur s'est produite, la transaction doit être terminée pour que la base de données soit dans un état cohérent. Il existe des instructions SQL pour cela :

COMMIT - enregistre les modifications apportées par la transaction dans la base de données. Cela signifie que la transaction s'est terminée avec succès.

ROLLBACK - restauration des transactions. La transaction se termine et aucune modification n'est apportée à la base de données. Cette opération est effectuée lorsqu'une erreur survient au cours de l'opération (par exemple, lorsqu'il est impossible de mettre à jour un enregistrement).

Service de transactions Java

L'architecture EJB (Server Bean Technology, Enterprise JavaBeans) utilise le Java Transaction Service (JTS) comme coordinateur des transactions. Dans la terminologie JTS, ce coordinateur est appelé gestionnaire de transactions. Les participants à une transaction qui implémentent des ressources protégées transactionnelles telles que des bases de données relationnelles sont appelés gestionnaires de ressources. Lorsqu'une application lance une transaction, elle crée un objet qui représente cette transaction. L'application fait alors appel aux gestionnaires de ressources pour effectuer l'opération. Pendant l'exécution d'une transaction, chacun des gestionnaires de transactions surveille le travail de chacun des gestionnaires de ressources spécifiés dans la transaction.

Le premier appel de l'application à chacun des gestionnaires de ressources détermine la transaction en cours. Par exemple, si une application utilise une base de données relationnelle, elle appelle l'interface Java Database Connectivity (JDBC), qui associe l'objet transactionnel à la base de données. Désormais, tous les appels passés via cette connexion seront effectués au nom de la transaction de base de données elle-même, jusqu'à ce que la transaction se termine.

L'application valide le résultat de la transaction en appelant la méthode xa_commit() et signale que la transaction s'est terminée avec succès. Si, pour une raison quelconque, l'application ne peut pas terminer la transaction, elle appelle la méthode xa_rollback(), qui annule les modifications apportées. Si l'application ne parvient pas à terminer la transaction, JTS abandonne la tâche. Lorsque l'opération transactionnelle réussit, l'application fait appel au JTS pour stocker le résultat. Le JTS passe ensuite par un protocole de validation en deux phases pour soumettre le travail aux gestionnaires de ressources spécifiés dans la transaction.

Un protocole de validation en deux phases est utilisé pour garantir que le résultat d'une transaction est enregistré ou qu'un travail est annulé. Dans la première phase, le STC établit l'état de préparation de chacun des gestionnaires de ressources. Si chacun d'eux confirme qu'il est prêt, alors dans la deuxième phase le STC envoie un message à chacun d'eux indiquant le résultat. Si l'un des gestionnaires ne répond pas à la demande ou donne une réponse négative, JTS informe les autres gestionnaires que la transaction est annulée.


Il existe différents modèles de transactions qui peuvent être classés en fonction de diverses propriétés, notamment la structure de la transaction, la simultanéité au sein de la transaction, la durée, etc.

Actuellement, on distingue les types de transactions suivants : les transactions plates ou classiques, les transactions chaînées et les transactions imbriquées.

Les transactions plates, ou traditionnelles, sont caractérisées par quatre propriétés classiques : atomicité, consistance, isolement, durabilité (résistance) - ACID (Atomicité, Cohérence, Isolation, Durabilité). Les transactions traditionnelles sont parfois appelées transactions ACID. Les propriétés mentionnées ci-dessus signifient ce qui suit :

· Propriété d'atomicité(Atomicité) s'exprime dans le fait que la transaction doit être réalisée dans son ensemble ou pas du tout.

· Propriété de cohérence(Cohérence) garantit qu'à mesure que les transactions progressent, les données passent d'un état cohérent à un autre - la transaction ne rompt pas la cohérence mutuelle des données.

· Propriété d'isolement(Isolation) signifie que les transactions concurrentes pour l'accès à la base de données sont physiquement traitées de manière séquentielle, isolément les unes des autres, mais pour les utilisateurs, il semble qu'elles soient exécutées en parallèle.

· Propriété de durabilité(Durabilité) est interprété comme suit : si la transaction est terminée avec succès, les modifications des données qui ont été apportées par elle ne peuvent en aucun cas être perdues (même en cas d'erreurs ultérieures).

Il existe deux options pour effectuer une transaction. Si toutes les instructions aboutissent et qu'aucune défaillance matérielle ou logicielle ne s'est produite pendant la transaction, la transaction est validée.

La validation d'une transaction consiste à écrire sur le disque les modifications apportées à la base de données lors de l'exécution d'une transaction.

Jusqu'à ce que la transaction soit validée, il est permis d'annuler ces modifications, de restaurer la base de données dans l'état dans lequel elle se trouvait au moment où la transaction a commencé. La validation d'une transaction signifie que tous les résultats de la transaction sont rendus constants. Ils ne deviendront visibles pour les autres transactions qu'une fois la transaction en cours validée. Jusqu'à ce point, toutes les données affectées par la transaction seront « visibles » pour l'utilisateur dans l'état au début de la transaction en cours.

Si quelque chose se produit pendant l'exécution d'une transaction qui rend impossible son achèvement normalement, la base de données doit être ramenée à son état d'origine. Une annulation de transaction est l'action qui annule toutes les modifications de données apportées par les instructions SQL au corps de la transaction en attente actuelle.

Chaque déclaration d'une transaction fait sa part du travail, mais toutes ses déclarations doivent se terminer inconditionnellement pour que l'ensemble du travail se termine avec succès. Le regroupement d'instructions dans une transaction indique au SGBD que l'ensemble du groupe doit être exécuté dans son ensemble et que cette exécution doit être prise en charge automatiquement.

La norme ANSI/ISO SQL définit le modèle de transaction et les fonctions des instructions COMMIT et ROLLBACK. La norme spécifie qu'une transaction commence par la première instruction SQL, initiée par l'utilisateur ou contenue dans un programme, qui modifie l'état actuel de la base de données. Toutes les instructions SQL suivantes constituent le corps de la transaction. La transaction se termine de l'une des quatre manières possibles (Figure 11.1) :

1. l'instruction COMMIT signifie l'achèvement réussi de la transaction ; son utilisation apporte des modifications permanentes à la base de données au sein de la transaction en cours ;

2. l'instruction ROLLBACK interrompt la transaction, annulant les modifications apportées à la base de données dans le cadre de cette transaction ; une nouvelle transaction démarre immédiatement après l'utilisation de ROLLBACK ;

3. l'achèvement réussi du programme dans lequel la transaction en cours a été initiée signifie l'achèvement réussi de la transaction (comme si l'instruction COMMIT était utilisée) ;

4. la fin erronée du programme interrompt la transaction (comme si l'instruction ROLLBACK avait été utilisée).

Dans ce modèle, chaque instruction qui modifie l'état de la base de données est considérée comme une transaction. Par conséquent, une fois cette instruction terminée avec succès, la base de données entre dans un nouvel état stable.

Les premières versions des SGBD commerciaux implémentaient le modèle de transaction ANSI/ISO. Plus tard, un modèle de transaction étendu a été implémenté dans le SGBD SYBASE, qui comprend un certain nombre d'opérations supplémentaires. Le modèle SYBASE utilise les quatre opérateurs suivants :

· L'instruction BEGIN TRANSACTION indique le début d'une transaction. Contrairement au modèle ANSI/ISO, où le début d'une transaction est spécifié implicitement par la première instruction de modification de données, dans le modèle SYBASE, le début d'une transaction est spécifié explicitement à l'aide de l'instruction de début de transaction.

· L'instruction COMMIT TRANSACTION signale la réussite de la transaction. Elle est équivalente à l'instruction COMMIT dans le modèle standard ANSI/ISO. Cet opérateur, comme l'opérateur COMMIT, valide toutes les modifications apportées à la base de données lors de l'exécution d'une transaction.

· L'instruction SAVE TRANSACTION crée un point de sauvegarde à l'intérieur de la transaction qui correspond à l'état intermédiaire de la base de données enregistrée au moment de l'exécution de cette instruction. L'instruction SAVE TRANSACTION peut contenir le nom d'un point de sauvegarde. Ainsi, lors de l'exécution d'une transaction, plusieurs points de sauvegarde peuvent être stockés, correspondant à plusieurs états intermédiaires.

· L'opérateur ROLLBACK a deux modifications. Si cette instruction est utilisée sans paramètre supplémentaire, elle est interprétée comme une instruction rollback pour l'ensemble de la transaction, c'est-à-dire qu'elle équivaut dans ce cas à l'instruction ROLLBACK dans le modèle ANSI / ISO. Si l'instruction d'annulation a un paramètre et est écrite sous la forme ROLLBACK B, elle est alors interprétée comme une instruction d'annulation de transaction partielle vers le point de sauvegarde B.

Riz. 11.1.Modèle de transaction ANSI/ISO

Les principes d'exécution des transactions dans le modèle de transaction étendu sont illustrés à la Fig. 11.2. Dans la figure, les opérateurs sont marqués de chiffres afin qu'il nous soit plus pratique de suivre la progression de la transaction dans tous les cas possibles.

Riz. 11.2.Exemples d'exécution de transactions dans le modèle étendu

La transaction commence par un opérateur explicite du début de la transaction, qui a le numéro 1 dans notre schéma. Vient ensuite l'opérateur 2, qui est un opérateur de recherche et ne change pas l'état actuel de la base de données, et les opérateurs suivants 3 et 4 transférer la base de données vers un nouvel état. L'instruction 5 enregistre ce nouvel état intermédiaire de la base de données et le marque comme état intermédiaire au point A. Ensuite, les instructions 6 et 7 suivent, qui transfèrent la base de données vers un nouvel état. Et l'opérateur 8 enregistre cet état en tant qu'état intermédiaire au point B. L'opérateur 9 effectue une nouvelle entrée de données, et l'opérateur 10 effectue une vérification de la condition 1 ; si la condition 1 est satisfaite, alors l'instruction 11 est exécutée, ce qui ramène la transaction à l'état intermédiaire B. Cela signifie que les conséquences des actions de l'instruction 9 sont en quelque sorte effacées et la base de données retourne à nouveau à l'état intermédiaire B, bien qu'après l'exécution de la déclaration 9, il était déjà dans un nouvel état. Et après l'annulation de la transaction, au lieu de l'instruction 9, qui était précédemment exécutée à partir de l'état Dans la base de données, l'instruction 13 de saisie de nouvelles données est exécutée, puis le contrôle est transféré à l'instruction 14. L'instruction 14 vérifie à nouveau la condition, mais déjà certains état neuf 2 ; si la condition est remplie, alors le contrôle est transféré à l'opérateur 15, qui annule la transaction à l'état intermédiaire A, c'est-à-dire que tous les opérateurs qui ont modifié la base de données, commençant par 6 et finissant par 13, sont considérés comme non remplis, c'est-à-dire , les résultats de leur exécution ont disparu et nous sommes à nouveau dans l'état Et, comme après avoir exécuté l'opérateur 4. Ensuite, le contrôle est transféré à l'opérateur 17, qui met à jour le contenu de la base de données, après quoi le contrôle est transféré à l'opérateur 18, qui est associée à la condition de vérification 3. La vérification se termine soit par le transfert du contrôle à l'opérateur 20, qui valide la transaction, et la base de données passe à un nouvel état stable, et il est impossible de la modifier dans la transaction en cours. Ou, si le contrôle est transféré à l'opérateur 19, alors la transaction est restaurée au début et la base de données revient à son état initial, et tous les états intermédiaires ont déjà été vérifiés ici, et il est impossible d'effectuer une opération de restauration sur ces intermédiaires états après l'exécution de l'opérateur 19.

Bien entendu, le modèle de transaction étendu de SYBASE prend en charge un mécanisme d'exécution de transaction beaucoup plus flexible. Les points de sauvegarde permettent de définir des marqueurs dans une transaction afin que seule une partie du travail effectué dans la transaction puisse être annulée. Il est conseillé d'utiliser des points de sauvegarde dans les transactions longues et complexes pour fournir une fonctionnalité d'annulation pour des instructions spécifiques. Cependant, cela entraîne des coûts supplémentaires de ressources système - l'opérateur effectue le travail et les modifications sont alors annulées ; généralement, des améliorations dans la logique de traitement peuvent être une meilleure solution.

Journal des transactions

La mise en œuvre dans le SGBD du principe de préservation des états intermédiaires, de confirmation ou d'annulation d'une transaction est assurée par un mécanisme spécial, pour le support duquel une certaine structure système est créée, appelée Journal des transactions.

Cependant, le but du journal des transactions est beaucoup plus large. Il est conçu pour fournir un stockage de données fiable dans la base de données.

Et cette exigence implique, en particulier, la capacité de restaurer l'état cohérent de la base de données après tout type de pannes matérielles et logicielles. Évidemment, certaines informations supplémentaires sont nécessaires pour effectuer des restaurations. Dans l'écrasante majorité des SGBD relationnels modernes, ces informations supplémentaires redondantes sont conservées sous la forme d'un journal des modifications de la base de données, le plus souvent appelé Journal des transactions.

Ainsi, l'objectif global de la journalisation des modifications de la base de données est de garantir que la base de données peut être restaurée dans un état cohérent après toute défaillance. Étant donné que la base du maintien de l'intégrité d'une base de données est le mécanisme de transaction, la journalisation et la récupération sont étroitement liées au concept de transaction. Les principes généraux de récupération sont les suivants :

· Les résultats des transactions validées doivent être sauvegardés dans l'état restauré de la base de données ;

· Les résultats des transactions non validées ne doivent pas être présents dans l'état restauré de la base de données.

Cela signifie en fait que l'état cohérent le plus récent de la base de données est en cours de restauration.

Les situations suivantes sont possibles dans lesquelles vous devez restaurer l'état de la base de données.

· Annulation individuelle de la transaction. Cette restauration doit être appliquée dans les cas suivants :

o la situation standard pour une annulation de transaction est son achèvement explicite avec une instruction ROLLBACK ;

o fin anormale du programme d'application, qui est logiquement équivalente à l'exécution de l'instruction ROLLBACK, mais a physiquement un mécanisme d'exécution différent ;

o rollback forcé d'une transaction en cas de blocage dans l'exécution parallèle de transactions. Dans un tel cas, pour sortir de l'impasse, cette transaction peut être sélectionnée comme une "victime" et son exécution par le noyau du SGBD terminée de force.

· Récupération après une perte soudaine du contenu de la RAM (soft Failure). Cette situation peut survenir dans les cas suivants :

o en cas d'arrêt d'urgence de l'alimentation électrique ;

o en cas de panne irrécupérable du processeur (par exemple, fonctionnement du contrôle RAM), etc. La situation est caractérisée par la perte de la partie de la base de données qui était contenue dans les buffers RAM au moment de la panne.

· Récupération suite à une panne des principaux supports externes de la base de données (hard Failure). Cette situation, étant donné une fiabilité suffisamment élevée des dispositifs de mémoire externes modernes, peut se produire relativement rarement, mais néanmoins le SGBD devrait pouvoir restaurer la base de données même dans ce cas. La base de la récupération est la copie d'archive et le journal des modifications de la base de données.

Pour restaurer un état cohérent de la base de données lorsque vous annulez individuellement une transaction, vous devez éliminer les effets des instructions de modification de la base de données qui ont été exécutées dans cette transaction. Pour restaurer un état cohérent de la base de données en cas de panne logicielle, il est nécessaire de restaurer le contenu de la base de données à partir du contenu des journaux de transactions stockés sur les disques. Pour restaurer un état cohérent de la base de données en cas de panne matérielle, il est nécessaire de restaurer le contenu de la base de données à partir des copies d'archive et des journaux de transactions qui sont stockés sur un support externe non endommagé.

Dans les trois cas, le stockage de données redondant est la base de la récupération. Ces données redondantes sont stockées dans un journal contenant une séquence d'enregistrements de modification de la base de données.

Il existe deux options principales pour conserver les informations de journal. Dans la première option, un journal des modifications de la base de données locale distinct est conservé pour chaque transaction par cette transaction. Ces journaux sont appelés journaux locaux. Ils sont utilisés pour les annulations individuelles de transactions et peuvent être conservés dans la mémoire RAM (plus correctement, dans la mémoire virtuelle). De plus, un journal général des modifications de la base de données est conservé, qui est utilisé pour récupérer l'état de la base de données après des pannes logicielles et matérielles.

Cette approche vous permet d'effectuer rapidement des annulations de transactions individuelles, mais entraîne des informations en double dans les journaux locaux et partagés. Par conséquent, la deuxième option est plus souvent utilisée - ne conserver qu'un journal général des modifications de la base de données, qui est également utilisé lors de l'exécution de restaurations individuelles. Ensuite, nous considérons cette option particulière.

La structure générale du journal peut être représentée de manière conditionnelle sous la forme d'un fichier séquentiel, qui enregistre chaque modification apportée à la base de données lors de l'exécution d'une transaction. Toutes les transactions ont leurs propres numéros internes, de sorte que toutes les modifications apportées par toutes les transactions sont enregistrées dans un seul journal des transactions.

Chaque entrée du journal des transactions est marquée du numéro de la transaction à laquelle elle appartient et des valeurs des attributs qu'elle modifie. De plus, pour chaque transaction, la commande de début et de fin de la transaction est enregistrée dans le journal (voir Figure 11.3).

Pour une plus grande fiabilité, le journal des transactions est souvent dupliqué par les outils système des SGBD commerciaux, c'est pourquoi la quantité de mémoire externe est plusieurs fois supérieure à la quantité réelle de données stockées dans le stockage.

Il existe deux alternatives pour la journalisation des transactions : le protocole de mise à jour différée et le protocole de mise à jour immédiate.

La journalisation des modifications en attente suppose le mécanisme suivant pour l'exécution des transactions :

1. Au début de la transaction T1, un enregistrement est saisi dans le protocole

<Т1 Begin transaction>

2. Lors de l'exécution de la transaction, une nouvelle valeur est écrite dans le protocole pour chaque enregistrement modifié : ... Ici, ID_RECORD est un numéro d'enregistrement unique.

3. Si toutes les actions qui composent la transaction T1 ont été effectuées avec succès, alors la transaction est partiellement enregistrée et entrée dans le protocole.<Т1 СОММIТ>.

4. Une fois la transaction validée, les enregistrements de protocole liés à T1 sont utilisés pour apporter les modifications appropriées à la base de données.

5. En cas d'échec, le SGBD consulte le journal et identifie les transactions à refaire. La transaction T1 doit être refaite si le protocole contient les deux enregistrements<Т1 BEGIN TRANSACTION и <Т1 СОММIТ>... La base de données peut être dans un état incohérent, cependant, toutes les nouvelles valeurs des éléments de données modifiés sont contenues dans le journal, ce qui nécessite la réexécution de la transaction. Pour cela, une procédure système REDOQ est utilisée, qui remplace toutes les valeurs des éléments de données par de nouvelles, en regardant le protocole dans l'ordre direct.

6. Si le protocole ne contient pas la commande COMMIT transaction commit, aucune action n'est requise et la transaction est redémarrée.

Riz. 11.3.Journal des transactions

Un mécanisme alternatif à exécution immédiate permet d'apporter des modifications immédiatement à la base de données, et non seulement les nouvelles, mais aussi toutes les anciennes valeurs des attributs modifiés sont entrées dans le protocole, de sorte que chaque enregistrement ressemble à<Т1, ID_RECORD, атрибут новое значение старое значение...>... Dans ce cas, l'écriture dans le journal précède l'exécution directe de l'opération sur la base de données. Lorsque la transaction est validée, c'est-à-dire que la commande est rencontrée<Т1 СОММIТ>et qu'elle est exécutée, alors toutes les modifications sont déjà apportées à la base de données et aucune autre action n'est requise par rapport à cette transaction.

Lorsqu'une transaction est annulée, la procédure système UNDO () est exécutée, qui renvoie toutes les anciennes valeurs de la transaction annulée, en procédant de manière séquentielle à travers le protocole en commençant par la commande BEGIN TRANSACTION.

Le mécanisme suivant est utilisé pour le basculement :

· Si une transaction contient une commande pour démarrer une transaction, mais ne contient pas de commande de validation avec confirmation de son exécution, la séquence d'actions est exécutée comme lorsque la transaction est annulée, c'est-à-dire que les anciennes valeurs sont restaurées .

· Si l'échec s'est produit après l'exécution de la dernière commande de modification de la base de données, mais avant l'exécution de la commande de validation, la commande de validation est exécutée et aucune modification n'est apportée à la base de données. Le travail n'a lieu qu'au niveau du protocole.

· Cependant, il convient de noter que les problèmes de récupération semblent beaucoup plus compliqués que les algorithmes donnés précédemment, étant donné que les modifications apportées à la fois au journal et à la base de données ne sont pas immédiatement enregistrées, mais mises en mémoire tampon. La section suivante y est consacrée.

Journalisation et mise en mémoire tampon

La journalisation des modifications est étroitement liée non seulement à la gestion des transactions, mais également à la mise en mémoire tampon des pages de la base de données.

Si un enregistrement de modification de base de données, qui devrait aller dans le journal pour toute opération de modification de base de données, était en fait immédiatement écrit dans la mémoire externe, cela ralentirait considérablement le système. Par conséquent, les enregistrements du journal sont également mis en mémoire tampon : pendant le fonctionnement normal, la page suivante est poussée dans la mémoire externe du journal uniquement lorsqu'elle est pleine d'enregistrements.

Le défi consiste à concevoir une politique de poussée générale pour s'assurer que la base de données peut être récupérée après un plantage.

Le problème ne se pose pas avec les annulations individuelles de transactions, car dans ces cas, le contenu de la mémoire principale n'est pas perdu et le contenu à la fois du tampon de journal et des tampons de page de la base de données peut être utilisé. Cependant, si une défaillance logicielle se produit et que le contenu des tampons est perdu, vous devez disposer d'un état cohérent du journal et de la base de données dans la mémoire externe afin de récupérer la base de données.

Le principe de base d'une politique cohérente pour le popping du tampon de journal et des tampons de page de base de données est qu'une modification apportée à un objet de base de données doit être écrite dans la mémoire de journal externe avant que l'objet modifié ne soit dans la mémoire de base de données externe. Le protocole de journalisation (et de gestion de la mise en mémoire tampon) correspondant est appelé Write Ahead Log (WAL) - "écrire d'abord dans le journal" et consiste dans le fait que si vous souhaitez écrire un objet de base de données modifié dans la mémoire externe, vous devez d'abord vous assurer que le le journal des transactions est écrit dans des enregistrements de mémoire externe de sa modification.

En d'autres termes, s'il existe un objet de base de données dans la mémoire externe de la base de données, par rapport auquel l'opération de modification a été effectuée, alors dans la mémoire externe du journal, il existe nécessairement un enregistrement correspondant à cette opération. L'inverse n'est pas vrai, c'est-à-dire que si la mémoire externe du journal contient un enregistrement concernant une opération de modification d'un objet de base de données, l'objet modifié lui-même peut ne pas être présent dans la mémoire externe de la base de données.

Une condition supplémentaire pour pousser les tampons est imposée par l'exigence que chaque transaction terminée avec succès doit réellement être validée dans la mémoire externe. Quelle que soit la défaillance qui se produit, le système doit être capable de restaurer l'état de la base de données contenant les résultats de toutes les transactions engagées au moment de la défaillance.

Une solution simple serait un affichage du tampon de journal suivi d'un affichage en bloc des tampons de page de base de données modifiés par la transaction. Cela se fait assez souvent, mais cela introduit une surcharge importante lors de l'exécution d'une opération de validation.

Il s'avère que la condition minimale pour garantir que le dernier état cohérent de la base de données peut être restauré est que lorsqu'une transaction est validée, tous les enregistrements de modification de base de données par cette transaction sont poussés dans la mémoire externe du journal. Dans ce cas, le dernier enregistrement dans le journal fait au nom de cette transaction est un enregistrement spécial sur la fin de la transaction.

Voyons maintenant comment vous pouvez effectuer des opérations de restauration de base de données dans diverses situations si le système maintient un journal commun mis en mémoire tampon pour toutes les transactions et est maintenu conformément au protocole WAL.

Annulation individuelle d'une transaction

Afin de pouvoir effectuer une annulation de transaction individuelle sur le journal général, tous les enregistrements de journal pour cette transaction sont liés dans une liste inversée. Le haut de la liste des transactions ayant échoué est la dernière modification de la base de données effectuée par cette transaction. Pour les transactions terminées (dont les rollbacks individuels ne sont plus possibles), le début de la liste est l'enregistrement de la fin de la transaction, qui est nécessairement poussé dans la mémoire externe du journal. La fin de la liste est toujours la première enregistrement de la modification de la base de données effectuée par cette transaction. En règle générale, chaque enregistrement se voit attribuer un ID de transaction unique afin qu'une liste directe d'enregistrements de modification de base de données puisse être restaurée par une transaction donnée.

Ainsi, une annulation de transaction individuelle (nous soulignons encore une fois que cela n'est possible que pour les transactions non validées) est effectuée comme suit :

· L'enregistrement suivant est sélectionné dans la liste de cette transaction.

· L'opération inverse est effectuée : au lieu d'une opération INSERT, une opération DELETE correspondante est effectuée, une opération INSERT est effectuée au lieu d'une opération DELETE, et au lieu d'une opération UPDATE directe, une opération UPDATE inverse restaure l'état précédent de la base de données objet.

· Toutes ces opérations inversées sont également enregistrées. En fait, cela n'est pas nécessaire pour une annulation individuelle, mais lors de l'exécution d'une annulation individuelle d'une transaction, une défaillance logicielle peut se produire, lors de la récupération à partir de laquelle il sera nécessaire d'annuler une transaction pour laquelle l'annulation individuelle n'a pas été complètement terminée.

· Si la restauration se termine avec succès, un enregistrement de la fin de la transaction est écrit dans le journal. Du point de vue du journal, une telle transaction est validée.

Récupération d'un échec logiciel

L'un des principaux problèmes liés à la récupération après une défaillance logicielle est qu'une seule opération de changement de base de données logique peut modifier plusieurs blocs de base de données physiques, tels qu'une page de données et plusieurs pages d'index. Les pages de la base de données sont mises en mémoire tampon dans la RAM et affichées indépendamment. Malgré l'utilisation du protocole WAL, après une défaillance logicielle, l'ensemble des pages de la mémoire externe de la base de données peut s'avérer incohérent, c'est-à-dire que certaines pages de la mémoire externe correspondent à l'objet avant le changement, et certaines - après le changement. Les opérations du niveau logique ne sont pas applicables à cet état de l'objet.

L'état de la mémoire externe d'une base de données est appelé physiquement cohérent si les ensembles de pages de tous les objets sont cohérents, c'est-à-dire qu'ils correspondent à l'état de l'objet avant ou après sa modification.

Nous supposerons que le journal marque les points de cohérence physique de la base de données - les moments auxquels la mémoire externe contient les résultats cohérents des opérations qui se sont terminées avant le moment correspondant, et il n'y a pas de résultats d'opérations qui ont pas terminé, et le tampon de journal est poussé dans la mémoire externe. Nous verrons comment la cohérence physique peut être atteinte un peu plus tard. Appelons de tels points tpc (temps de cohérence physique) - points d'accord physique.

Ensuite, au moment d'une défaillance logicielle, les états de transaction suivants sont possibles :

· La transaction s'est terminée avec succès, c'est-à-dire que l'opération de la transaction COMMIT a été confirmée et pour toutes les opérations de la transaction, une confirmation de son exécution dans la mémoire externe a été reçue ;

· La transaction s'est terminée avec succès, mais pour certaines opérations, la confirmation de leur exécution dans la mémoire externe n'a pas été reçue ;

· La transaction a reçu et exécuté la commande ROLLBACK ;

· La transaction n'est pas terminée.

Cohérence physique de la base de données

Comment s'assurer qu'il existe des points de cohérence physique dans la base de données, c'est-à-dire comment restaurer l'état de la base de données au moment du tpc ? Pour ce faire, deux approches principales sont utilisées : une approche basée sur les ombres et une approche qui utilise la journalisation des modifications de la base de données page par page.

Lorsqu'un fichier est ouvert, la table de mise en correspondance des numéros de ses blocs logiques avec les adresses des blocs physiques de la mémoire externe est lue en RAM. Lorsqu'un bloc d'un fichier est modifié, un nouveau bloc est alloué en mémoire externe. Dans ce cas, la table de mappage actuelle (en RAM) est modifiée et la table fantôme reste inchangée. Si un échec se produit lors de l'utilisation d'un fichier ouvert, l'état du fichier avant son ouverture est automatiquement enregistré dans la mémoire externe. Pour restaurer explicitement le fichier, il suffit de relire la table de mappage d'ombre dans la RAM.

L'idée générale du mécanisme de l'ombre est illustrée à la Fig. 11.4.

Riz. 11.4.Utilisation des tables d'affichage des ombres

Dans le contexte d'une base de données, le mécanisme de shadow est utilisé comme suit. Des points de contrôle sont effectués périodiquement. Pour ce faire, toutes les opérations logiques sont terminées, tous les tampons de la mémoire principale, dont le contenu ne correspond pas au contenu des pages correspondantes de la mémoire externe, sont expulsés. La table d'ombre pour les fichiers de base de données de mappage est remplacée par la table actuelle (plus correctement, la table de mappage actuelle est écrite à la place de la table d'ombre).

La restauration vers tpc est instantanée : la table de mappage actuelle est remplacée par une shadow (lors de la restauration, la table de mappage shadow est simplement lue). Tous les problèmes de récupération sont résolus, mais au prix d'une trop grande utilisation de la mémoire externe. À la limite, vous aurez peut-être besoin de deux fois plus de mémoire externe que vous n'en avez réellement besoin pour stocker la base de données. Le mécanisme de l'ombre est un outil fiable mais trop grossier. Un état cohérent de la mémoire externe est fourni à un moment donné commun à tous les objets. En fait, il suffit d'avoir un ensemble d'ensembles de pages cohérents, chacun pouvant correspondre à ses propres échantillons temporels.

Pour répondre à une exigence aussi faible, parallèlement à la journalisation logique des opérations de modification de la base de données, les modifications page par page sont enregistrées. La première étape de la récupération après une défaillance logicielle consiste à annuler les opérations logiques ayant échoué une page à la fois. Comme c'est le cas avec les enregistrements logiques en ce qui concerne les transactions, le dernier enregistrement de modification paginé d'une seule opération logique est la fin de l'opération.

Il existe deux méthodes pour résoudre le problème dans cette approche. La première méthode maintient un journal commun des opérations logiques et de pagination. Naturellement, la présence de deux types de notices, interprétées de manières complètement différentes, complique la structure de la revue. De plus, les enregistrements des changements page par page, dont la pertinence est de nature locale, augmentent significativement (et pas très significativement) la revue.

Par conséquent, il devient de plus en plus populaire de maintenir un journal séparé (court) des changements paginés. Cette technique est utilisée, par exemple, dans le produit bien connu Informix Online.

Supposons que d'une manière ou d'une autre, il soit possible de restaurer la mémoire externe de la base de données à l'état au moment tpc (comment cela peut être fait - un peu plus tard). Puis:

· Aucune action n'est requise pour la transaction T1. Il s'est terminé avant tpc, et tous ses résultats sont reflétés dans la mémoire externe de la base de données.

· Pour la transaction T2, vous devez ré-exécuter le reste des opérations (refaire). En effet, dans la mémoire externe il n'y a absolument aucune trace des opérations qui ont été effectuées dans la transaction T2 après l'instant tpc. Par conséquent, la réinterprétation directe des opérations T2 est correcte et conduira à un état logiquement cohérent de la base de données (puisque la transaction T2 s'est terminée avec succès avant l'échec logiciel, le journal contient un enregistrement de toutes les modifications apportées par cette transaction).

· Pour une transaction TK, la première partie des opérations (annulation) doit être effectuée dans le sens inverse. En effet, dans la mémoire externe de la base de données, les résultats des opérations TK qui ont été effectuées après l'instant tpc sont totalement absents. D'un autre côté, la mémoire externe est garantie de contenir les résultats des opérations TK qui ont été effectuées avant tpc. Par conséquent, l'interprétation inverse des opérations TK est correcte et conduira à un état cohérent de la base de données (puisque la transaction TK ne s'est pas terminée au moment d'une défaillance logicielle, lors de la récupération, il est nécessaire de préserver toutes les conséquences de son exécution) .

· Pour une transaction T4 qui a commencé après tpc et s'est terminée avant un échec logiciel, une reprise complète doit être effectuée.

Enfin, aucune action n'est requise pour une transaction T5 qui a commencé après le moment tpc et n'a pas eu le temps de se terminer au moment de l'échec logiciel. Les résultats de cette transaction sont complètement absents de la mémoire externe de la base de données.

Récupération d'un crash dur

Il est clair que le journal des modifications de la base de données n'est pas suffisant pour restaurer la base de données à son dernier état cohérent après une panne matérielle. Dans ce cas, la base de récupération est le journal et la copie de sauvegarde de la base de données.

La récupération commence par une copie de la base de données à partir de la copie d'archive. Ensuite, un refaire est effectué pour toutes les transactions terminées, c'est-à-dire que les opérations sont réexécutées dans l'ordre.

Plus précisément, il se passe ce qui suit :

· Toutes les opérations sont effectuées le long du journal dans le sens avant ;

· Pour les transactions qui ne sont pas terminées au moment de l'échec, une annulation est effectuée.

En fait, étant donné qu'un crash dur n'entraîne pas de perte de mémoire tampon RAM, il est possible de restaurer la base de données à un niveau tel que même les transactions ayant échoué peuvent continuer. Mais cela n'est généralement pas fait car la récupération d'un crash dur est un processus assez long.

Bien qu'il existe des exigences particulières pour la journalisation en termes de fiabilité, elle peut en principe être perdue. Ensuite, le seul moyen de restaurer la base de données est de revenir à la copie d'archive. Bien sûr, dans ce cas, vous ne pourrez pas obtenir le dernier état cohérent de la base de données, mais c'est mieux que rien.

Le dernier problème que nous aborderons brièvement concerne la réalisation de sauvegardes d'une base de données. Le moyen le plus simple est d'archiver la base de données lorsque le journal est plein. La "zone jaune" est introduite dans le journal, une fois atteinte, la formation de nouvelles transactions est temporairement bloquée. Lorsque toutes les transactions sont terminées et que, par conséquent, la base de données est dans un état cohérent, vous pouvez l'archiver, puis recommencer à remplir le journal.

Vous pouvez sauvegarder la base de données moins souvent que le journal ne se remplit. Si le journal est plein et que toutes les transactions démarrées sont terminées, vous pouvez archiver le journal lui-même. Étant donné qu'un tel journal archivé n'est essentiellement requis que pour recréer une copie archivée de la base de données, les informations du journal archivé peuvent être considérablement compressées.

Vous avez aimé l'article ? Partager avec des amis: