Modèle de mise QLDB simultansimultansimultansimultansimultansimultansimultansimultansimultanéité - Amazon Quantum Ledger Database (Amazon QLDB)

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Modèle de mise QLDB simultansimultansimultansimultansimultansimultansimultansimultansimultanéité

Amazon QLDB est destiné à répondre aux besoins de travail de travail de travail de travail de traitement de traitement de traitement de traitement de traitement de traitement de traitement de traitement de traitement de traitement de traitement de traitement de traitement de QLDB prend en charge des fonctionnalités de requête de type SQL et fournit des transactions ACID complètes. De plus, les éléments de données QLDB sont des documents qui offrent une flexibilité de schéma et une modélisation intuitive des données. Grâce à un journal, vous pouvez utiliser QLDB pour accéder à l'historique complet et vérifiable de toutes les modifications apportées à vos données et diffuser des transactions cohérentes vers d'autres services de données selon vos besoins.

Contrôle optimiste de la simultanéité

Dans QLDB, le contrôle de la concurrence est mis en œuvre à l'aide d'un contrôle de concurrence optimiste (OCC). L'OCC fonctionne selon le principe que plusieurs transactions peuvent souvent être effectuées sans interférer les unes avec les autres.

Grâce à l'OCC, les transactions dans QLDB ne verrouillent pas les ressources de la base de données et fonctionnent avec une isolation sérialisable complète. QLDB exécute des transactions simultanées en série, de telle sorte qu'il produit le même effet que si ces transactions étaient lancées en série.

Avant de valider, chaque transaction effectue un contrôle de validation pour s'assurer qu'aucune autre transaction validée n'a modifié les données auxquelles elle accède. Si cette vérification révèle des modifications contradictoires ou si l'état des données change, la transaction de validation est rejetée. Toutefois, la transaction peut être redémarrée.

Lorsqu'une transaction est écrite dans QLDB, les contrôles de validation du modèle OCC sont implémentés par QLDB lui-même. Si une transaction ne peut pas être écrite dans le journal en raison d'un échec lors de la phase de vérification de l'OCC, QLDB renvoie une transactionOccConflictException à la couche application. Le logiciel d'application est chargé de s'assurer que la transaction est redémarrée. L'application doit abandonner la transaction refusée, puis réessayer l'ensemble de la transaction depuis le début.

Pour savoir comment le pilote QLDB gère et réessaie les conflits OCC et les autres exceptions transitoires, consultezComprendre la stratégie de nouvelle tentative avec le pilote dans Amazon QLDB.

Utilisation d'index pour éviter l'analyse complète des tables

Dans QLDB, chaque instruction partiQL (y compris chaqueSELECT requête) est traitée dans le cadre d'une transaction et est soumise à un délai d'expiration de transaction.

Il est recommandé d'exécuter des instructions avec une clause deWHERE prédicat qui filtre en fonction d'un champ indexé ou d'un identifiant de document. QLDB a besoin d'un opérateur d'égalité sur un champ indexé pour rechercher efficacement un document ; par exemple,WHERE indexedField = 123 ouWHERE indexedField IN (456, 789).

Sans cette recherche indexée, QLDB doit effectuer une analyse complète de la table lors de la lecture de documents. Cela peut entraîner une latence des requêtes et des délais de transaction, et augmente également les risques de conflit OCC avec des transactions concurrentes.

Par exemple, considérez une table nomméeVehicle dont leVIN champ ne comporte qu'un index. Il contient les documents suivants.

VIN Marque Modèle Couleur
"1N4AL11D75C109151" "Audi" "A5" "Silver"
"KM8SRDHF6EU074761" "Tesla" "Model S" "Blue"
"3HGGK5G53FM761765" "Ducati" "Monster 1200" "Yellow"
"1HVBBAANXWH544237" "Ford" "F 150" "Black"
"1C4RJFAG0FC625797" "Mercedes" "CLK 350" "White"

Deux utilisateurs simultanés nommés Alice et Bob travaillent avec la même table dans un registre. Ils souhaitent mettre à jour deux documents différents, comme suit.

Alice :

UPDATE Vehicle AS v SET v.Color = 'Blue' WHERE v.VIN = '1N4AL11D75C109151'

Bob :

UPDATE Vehicle AS v SET v.Color = 'Red' WHERE v.Make = 'Tesla' AND v.Model = 'Model S'

Supposons qu'Alice et Bob commencent leurs transactions en même temps. LaUPDATE déclaration d'Alice effectue une recherche indexée sur leVIN champ, elle n'a donc besoin que de lire ce document. Alice termine et valide sa transaction avec succès en premier.

L'instruction de Bob filtre les champs non indexés. Elle analyse donc une table et trouve unOccConflictException. Cela est dû au fait que la transaction validée d'Alice a modifié les données auxquelles la déclaration de Bob accède, ce qui inclut tous les documents du tableau, et pas seulement le document que Bob est en train de mettre à jour.

Conflits d'insertion OCC

Les conflits OCC peuvent inclure des documents récemment insérés, et pas uniquement des documents qui existaient auparavant. Examinez le diagramme suivant, dans lequel deux utilisateurs simultanéité (Alice et Bob) utilisent la même table dans un registre. Ils souhaitent tous deux insérer un nouveau document uniquement à la condition qu'aucune valeur de prédicat n'existe encore.


                Diagramme de contrôle optimiste de la simultanéité (OCC) Amazon QLDB présentant un exemple d'exception de conflit entre deux utilisateurs simultanés.

Dans cet exemple, Alice et Bob exécutent lesINSERT instructionsSELECT et les instructions suivantes au sein d'une seule transaction. Leur application exécute l'INSERTinstruction uniquement si celle-ciSELECT ne donne aucun résultat.

SELECT * FROM Vehicle v WHERE v.VIN = 'ABCDE12345EXAMPLE'
INSERT INTO Vehicle VALUE { 'VIN' : 'ABCDE12345EXAMPLE', 'Type' : 'Wagon', 'Year' : 2019, 'Make' : 'Subaru', 'Model' : 'Outback', 'Color' : 'Gray' }

Supposons qu'Alice et Bob commencent leurs transactions en même temps. Leurs deuxSELECT requêtes ne renvoient aucun document existant avec unVIN ofABCDE12345EXAMPLE. Leurs demandes se poursuivent donc avec laINSERT déclaration.

Alice termine et valide sa transaction avec succès en premier. Ensuite, Bob essaie de valider sa transaction, mais QLDB la rejette et lance unOccConflictException. Cela est dû au fait que la transaction validée d'Alice a modifié le jeu de résultats de laSELECT requête de Bob et qu'OCC détecte ce conflit avant de valider la transaction de Bob.

LaSELECT requête est requise pour que cet exemple de transaction soit idempotent. Bob peut alors recommencer l'ensemble de sa transaction depuis le début. Mais sa prochaineSELECT requête renverra le document qu'Alice a inséré, de sorte que l'application de Bob n'exécutera pas leINSERT.

Capacités de mise à l'échelle de mise à

La transaction d'insertion présentée dans la section précédente est également un exemple de transaction idempotente. En d'autres termes, l'exécution de la même transaction plusieurs fois produit des résultats identiques. Si Bob exécute leINSERT sans vérifier au préalable si un élément existeVIN déjà, le tableau peut se retrouver avec des documents contenant desVIN valeurs dupliquées.

Outre les conflits OCC, envisagez d'autres scénarios de nouvelle tentative. Par exemple, il est possible que QLDB valide avec succès une transaction côté serveur, mais que le client expire en attendant une réponse. Il est recommandé de rendre vos transactions d'écriture idempotentes afin d'éviter tout effet secondaire inattendu en cas de simultanéité ou de nouvelles tentatives.

Conflits de rédaction OCC

QLDB empêche les rédactions simultanées de révisions sur le même bloc de journal. Prenons l'exemple de deux utilisateurs simultanés (Alice et Bob) qui souhaitent rédiger deux révisions de documents différentes qui sont validées sur le même bloc dans un registre. Tout d'abord, Alice demande la rédaction d'une révision en exécutant la procédureREDACT_REVISION stockée, comme suit.

EXEC REDACT_REVISION `{strandId:"JdxjkR9bSYB5jMHWcI464T", sequenceNo:17}`, '5PLf9SXwndd63lPaSIa0O6', 'ADR2Ll1fGsU4Jr4EqTdnQF'

Ensuite, alors que la demande d'Alice est toujours en cours de traitement, Bob demande la rédaction d'une autre révision, comme suit.

EXEC REDACT_REVISION `{strandId:"JdxjkR9bSYB5jMHWcI464T", sequenceNo:17}`, '8F0TPCmdNQ6JTRpiLj2TmW', '05K8zpGYWynDlEOK5afDRc'

QLDB rejette la demande de BobOccConflictException même s'ils essaient de rédiger deux révisions de documents différentes. Cela est dû au fait que la révision de Bob se trouve dans le même bloc que la révision qu'Alice est en train de rédiger. Une fois le traitement de la demande d'Alice terminé, Bob peut réessayer sa demande de rédaction.

De même, si deux transactions simultanées tentent de modifier la même révision, une seule demande peut être traitée. L'autre demande échoue avec une exception de conflit OCC jusqu'à ce que la rédaction soit terminée. Par la suite, toute demande de rédaction de la même révision entraînera une erreur indiquant que la révision est déjà expurgée.

Gestion de mise à simultanéité

Si vous avez une expérience concernant l'utilisation d'un système de gestion de base de gestion de base de gestion de base de base de gestion de base de gestion de base de gestion de base de gestion de base de gestion de base de gestion de base de gestion de base QLDB n'a pas le même concept de connexion RDBMS traditionnelle, car les transactions sont exécutées à l'aide de messages de requête et de réponse HTTP.

Dans QLDB, le concept analogue est celui d'une session active. Une session est conceptuellement similaire à une connexion utilisateur : elle gère les informations relatives à vos demandes de transactions de données adressées à un registre. Une session active est une session qui exécute activement une transaction. Il peut également s'agir d'une session qui a récemment terminé une transaction et où le service prévoit d'en démarrer une autre immédiatement. QLDB prend en charge une transaction active par session.

La limite de sessions actives simultanées par registre est définie dansQuotas et limites d'Amazon QLDB. Une fois cette limite atteinte, toute session qui tente de démarrer une transaction génère une erreur (LimitExceededException).

Pour plus d'informations sur le cycle de vie d'une session et sur la manière dont le pilote QLDB gère les sessions lors de l'exécution de transactions de données, consultezGestion des sessions avec le chauffeur. Pour connaître les meilleures pratiques relatives à la configuration d'un pool de sessions dans votre application à l'aide du pilote QLDB, consultez les recommandations relativesConfiguration de QldbDriver objet au pilote Amazon QLDB.