Présentation des niveaux d’isolation
Les transactions spécifient un niveau d’isolation qui définit la façon dont une transaction spécifique est isolée des autres transactions. L’isolation est la séparation des modifications de ressources ou de données effectuées par différentes transactions. Les niveaux d’isolation déterminent les effets secondaires de la concurrence qui sont autorisés, tels que les lectures erronées ou les lectures fantômes.
Les niveaux d’isolation des transactions contrôlent les effets suivants :
l'acquisition de verrous lors de la lecture de données, et le type de verrous nécessaires ;
la durée de vie des verrous de lecture ;
Si les opérations de lecture faisant référence à des lignes sont modifiées par une autre transaction :
Blocage jusqu'à ce que le verrou exclusif sur la ligne soit levé
Récupération de la version validée de la ligne telle qu'elle était au début de l'instruction ou de la transaction
Lecture de la modification des données non validées
Choix d’un niveau d’isolation
Le choix du niveau d’isolation de la transaction n’affecte pas les verrous acquis pour protéger les modifications de données. Une transaction obtient toujours un verrou exclusif sur toutes les données qu’elle modifie. Elle maintient ce verrou jusqu’à la fin de la transaction, quel que soit le niveau d’isolation défini pour cette transaction. Pour les opérations de lecture, les niveaux d’isolation des transactions définissent principalement comment l’opération est protégée contre les effets d’autres transactions.
Un niveau d’isolation inférieur augmente la capacité de nombreux utilisateurs à accéder aux données en même temps. Mais cela augmente le nombre d’effets de concurrence, tels que les lectures erronées ou les mises à jour perdues, que les utilisateurs peuvent voir. À l’inverse, un niveau d’isolation plus élevé réduit les types d’effets de concurrence que les utilisateurs peuvent voir. Toutefois, il nécessite davantage de ressources système et augmente le risque qu’une transaction en bloque une autre. Le choix du niveau d'isolation adéquat dépend d'une mise en équilibre de l'espace réservé et des exigences en matière d'intégrité des données de l'application.
Le niveau d’isolation le plus élevé, sérialisable, garantit qu’une transaction récupère exactement les mêmes données à chaque fois qu’elle répète une opération de lecture. Toutefois, il utilise un niveau de verrouillage susceptible d’affecter les autres utilisateurs dans les systèmes multi-utilisateurs. Le niveau le plus bas, lecture non validée, permet la récupération de données qui ont été modifiées mais non validées par d'autres transactions. Tous les effets secondaires de concurrence peuvent se produire en lecture de données non validées, mais il n’a pas de verrouillage ou de contrôle de version de lecture, ce qui réduit la surcharge.
Remarques
Le tableau suivant répertorie les effets secondaires de la concurrence provoqués par les différents niveaux d'isolement.
Niveau d’isolation | Lecture erronée | Lecture non reproductible | Fantôme |
---|---|---|---|
Lecture non validée | Oui | Oui | Oui |
Lecture validée | Non | Oui | Oui |
Lecture renouvelable | Non | Non | Oui |
Instantané | Non | Non | Non |
Sérialisable | Non | Non | Non |
Les transactions doivent être exécutées à un niveau d’isolation d’une lecture renouvelable au minimum pour empêcher les pertes de mises à jour qui peuvent se produire lorsque deux transactions récupèrent la même ligne. La transaction met ultérieurement à jour la ligne en fonction des valeurs récupérées à l’origine. Si les deux transactions mettent à jour des lignes avec une seule instruction UPDATE sans se baser sur les valeurs récupérées auparavant, les mises à jour perdues ne peuvent pas se produire au niveau d’isolation par défaut de la lecture de données validées.
Pour définir le niveau d’isolement pour une transaction, vous pouvez utiliser la méthode setTransactionIsolation de la classe SQLServerConnection. Cette méthode accepte une valeur int comme argument, qui est basée sur l’une des constantes de connexion comme dans l’exemple suivant :
con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
Pour utiliser le nouveau niveau d'isolement d'instantané de SQL Server, vous pouvez utiliser l'une des constantes SQLServerConnection
:
con.setTransactionIsolation(SQLServerConnection.TRANSACTION_SNAPSHOT);
ou vous pouvez utiliser :
con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED + 4094);
Pour plus d’informations sur les niveaux d’isolement SQL Server, consultez « Niveaux d’isolement du Moteur de base de données » dans la documentation en ligne SQL Server.
Voir aussi
Réalisation de transactions avec le pilote JDBC
SET TRANSACTION ISOLATION LEVEL (Transact-SQL)