Partager via


Niveaux d’isolation des transactions dans les tables mémoire optimisées

Les niveaux d’isolation suivants sont pris en charge pour les transactions qui accèdent aux tables optimisées en mémoire.

  • INSTANTANÉ

  • LECTURE REPRODUCTIBLE

  • SÉRIALISABLE

  • LECTURE CONFIRMÉE

Le niveau d’isolation des transactions peut être spécifié dans le cadre du bloc atomique d’une procédure stockée compilée en mode natif. Pour plus d’informations, consultez CREATE PROCEDURE (Transact-SQL). Lors de l’accès aux tables optimisées en mémoire à partir de Transact-SQL interprété, le niveau d’isolation peut être spécifié à l’aide d’indicateurs au niveau de la table.

Vous devez spécifier le niveau d’isolation des transactions lorsque vous définissez une procédure stockée compilée en mode natif. Vous devez spécifier le niveau d’isolation dans les indications de table lorsqu'on accède aux tables à optimisation en mémoire depuis des transactions utilisateur en Transact-SQL interprété. Pour plus d’informations, consultez Instructions pour les niveaux d’isolation des transactions avec des tables Memory-Optimized.

Le niveau d’isolation READ COMMITTED est pris en charge pour les tables optimisées en mémoire avec des transactions de validation automatique. READ COMMITTED n’est pas valide dans les transactions utilisateur ou dans un bloc atomique. READ COMMITTED n’est pas pris en charge avec les transactions utilisateur explicites ou implicites. Le niveau d’isolation READ_COMMITTED_SNAPSHOT est pris en charge pour les tables optimisées en mémoire avec des transactions de validation automatique et uniquement si la requête n’accède à aucune table sur disque. En outre, les transactions qui sont commencées en utilisant des Transact-SQL interprétés avec l’isolation SNAPSHOT ne peuvent pas accéder aux tables optimisées en mémoire. Les transactions qui sont interprétées avec Transact-SQL avec une isolation REPEATABLE READ ou SERIALIZABLE doivent accéder aux tables optimisées en mémoire à l’aide de l’isolation SNAPSHOT. Pour plus d’informations sur ce scénario, consultez Transactions entre conteneurs.

READ COMMITTED est le niveau d’isolation par défaut dans SQL Server. Lorsque le niveau d’isolation de la session est READ COMMITED (ou inférieur), vous pouvez effectuer l’une des opérations suivantes :

  • Utilisez explicitement un indicateur de niveau d’isolation supérieur pour accéder à la table optimisée en mémoire (par exemple, WITH (SNAPSHOT)).

  • Spécifiez l’option MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT set, qui définit le niveau d’isolation des tables optimisées pour la mémoire sur SNAPSHOT (comme si vous ajoutiez des indices WITH(SNAPSHOT) à chaque table optimisée pour la mémoire). Pour plus d’informations sur MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT, consultez ALTER DATABASE SET Options (Transact-SQL).

Sinon, si le niveau d’isolation de la session est READ COMMITTED, vous pouvez utiliser des transactions de validation automatique.

Les transactions SNAPSHOT démarrées dans des Transact-SQL interprétées ne peuvent pas accéder aux tables optimisées en mémoire.

Les niveaux d’isolation des transactions pris en charge pour les tables optimisées en mémoire fournissent les mêmes garanties logiques que les tables sur disque. Le mécanisme utilisé pour fournir des garanties de niveau d’isolation est différent.

Pour les tables basées sur disque, la plupart des garanties de niveau d’isolation sont implémentées à l’aide du verrouillage, ce qui empêche les conflits par le blocage. Pour les tables optimisées en mémoire, les garanties sont appliquées à l’aide d’un mécanisme de détection de conflit, ce qui évite de devoir prendre des verrous. L'exception concerne l'isolation SNAPSHOT pour les tables basées sur disque. Cela est implémenté de manière similaire à l’isolation SNAPSHOT sur les tables optimisées en mémoire avec un mécanisme de détection de conflit.

INSTANTANÉ
Ce niveau d’isolation spécifie que les données lues par n’importe quelle instruction d’une transaction seront la version cohérente transactionnelle des données qui existaient au début de la transaction. La transaction ne peut reconnaître que les modifications de données validées avant le début de la transaction. Les modifications de données apportées par d’autres transactions après le début de la transaction actuelle ne sont pas visibles par les instructions s’exécutant dans la transaction actuelle. Les instructions d’une transaction obtiennent un instantané des données validées, telles qu'elles existaient au début de la transaction.

Les opérations d’écriture (mises à jour, insertions et suppressions) sont toujours entièrement isolées des autres transactions. Par conséquent, les opérations d’écriture dans une transaction SNAPSHOT peuvent entrer en conflit avec les opérations d’écriture par d’autres transactions. Lorsque la transaction actuelle tente de mettre à jour ou de supprimer une ligne qui a été mise à jour ou supprimée par une autre transaction validée après le démarrage de la transaction actuelle, la transaction se termine par le message d’erreur suivant.

Erreur 41302. La transaction actuelle a tenté de mettre à jour un enregistrement dans la table X qui a été mis à jour depuis le démarrage de cette transaction. La transaction a été abandonnée.

Lorsque la transaction actuelle tente d’insérer une ligne avec la même valeur de clé primaire qu’une ligne insérée par une autre transaction validée avant la transaction actuelle, il y aura un échec de validation avec le message d’erreur suivant.

Erreur 41325. La transaction actuelle n’a pas pu être validée en raison d’un échec de validation sérialisable.

Si une transaction écrit dans une table qui est supprimée avant la validation de la transaction, elle se termine par le message d’erreur suivant :

Erreur 41305. La transaction actuelle n’a pas pu être validée en raison d’un échec de validation de lecture reproductible.

LECTURE ISOLÉE RÉPÉTABLE
Ce niveau d’isolation inclut les garanties fournies par le niveau d’isolation SNAPSHOT. En outre, REPEATABLE READ garantit que pour toutes les lignes lues par la transaction, au moment où la transaction valide la ligne n’a pas été modifiée par une autre transaction. Chaque opération de lecture de la transaction est reproductible jusqu’à la fin de la transaction.

Si la transaction actuelle a lu une ligne qui a ensuite été mise à jour par une autre transaction validée avant la transaction actuelle, la validation échoue avec le message d’erreur suivant.

Erreur 41305. La transaction actuelle n’a pas pu être validée en raison d’un échec de validation de lecture reproductible.

SÉRIALISABLE
Ce niveau d’isolation inclut les garanties fournies par REPEATABLE READ. Aucune ligne fantôme n’est apparue entre l’instantané et la fin de la transaction. Les lignes fantômes correspondent à la condition de filtre d’une sélection, d’une mise à jour ou d’une suppression.

La transaction est exécutée comme s’il n’y a pas de transactions simultanées. Toutes les actions se produisent pratiquement à un point de sérialisation unique (heure de validation).

Si l’une de ces garanties est violée, la transaction ne parvient pas à s’valider avec le message d’erreur suivant :

Erreur 41325. La transaction actuelle n’a pas pu être validée en raison d’un échec de validation sérialisable.

Voir aussi

Présentation des transactions sur les tables Memory-Optimized
Instructions pour les niveaux d’isolation des transactions avec des tables Memory-Optimized
Instructions pour la logique de nouvelle tentative pour les transactions sur les tables Memory-Optimized