Partager via


Contrôle d’accès concurrentiel

L’accès concurrentiel est la possibilité de deux transactions d’utiliser les mêmes données en même temps, et l’isolation accrue des transactions est généralement réduite. Cela est dû au fait que l’isolation des transactions est généralement implémentée en verrouillant des lignes et, à mesure que d’autres lignes sont verrouillées, moins de transactions peuvent être effectuées sans être bloquées au moins temporairement par une ligne verrouillée. Bien que la concurrence réduite soit généralement acceptée comme compromis pour les niveaux d’isolation des transactions plus élevés nécessaires pour maintenir l’intégrité de la base de données, il peut devenir un problème dans les applications interactives avec une activité de lecture/écriture élevée qui utilise des curseurs.

Par exemple, supposons qu’une application exécute l’instruction SQL SELECT * FROM Orders. Il appelle SQLFetchScroll pour faire défiler le jeu de résultats et permet à l’utilisateur de mettre à jour, supprimer ou insérer des commandes. Une fois l’utilisateur mis à jour, supprime ou insère une commande, l’application valide la transaction.

Si le niveau d’isolation est en lecture reproductible, la transaction peut, selon la façon dont elle est implémentée, verrouiller chaque ligne retournée par SQLFetchScroll. Si le niveau d’isolation est Serializable, la transaction peut verrouiller l’intégralité de la table Orders. Dans les deux cas, la transaction libère ses verrous uniquement lorsqu’elle est validée ou restaurée. Ainsi, si l’utilisateur passe beaucoup de temps à lire les commandes et très peu de temps à mettre à jour, supprimer ou insérer, la transaction peut facilement verrouiller un grand nombre de lignes, ce qui les rend indisponibles pour d’autres utilisateurs.

Il s’agit d’un problème même si le curseur est en lecture seule et que l’application permet à l’utilisateur de lire uniquement les commandes existantes. Dans ce cas, l’application valide la transaction et libère des verrous, lorsqu’elle appelle SQLCloseCursor (en mode de validation automatique) ou SQLEndTran (en mode de validation manuelle).

Cette section contient les rubriques suivantes :