J'ai lu environ 4 niveaux d'isolement:
Isolation Level Dirty Read Nonrepeatable Read Phantom Read
READ UNCOMMITTED Permitted Permitted Permitted
READ COMMITTED -- Permitted Permitted
REPEATABLE READ -- -- Permitted
SERIALIZABLE -- -- --
Je veux comprendre le verrou que chaque isolation de transaction prend sur la table
READ UNCOMMITTED - no lock on table
READ COMMITTED - lock on committed data
REPEATABLE READ - lock on block of sql(which is selected by using select query)
SERIALIZABLE - lock on full table(on which Select query is fired)
Voici les trois phénomènes qui peuvent se produire dans l'isolement des transactions
Lecture sale - pas de verrou
Lecture non
répétable - pas de lecture sale comme verrou sur les données validées
Lecture fantôme - verrou sur le bloc de sql (qui est sélectionné à l'aide de la requête de sélection)
Je veux comprendre où nous définissons ces niveaux d'isolement: uniquement au niveau jdbc / hibernate ou dans DB également
PS: J'ai parcouru les liens dans les niveaux d'isolement dans oracle , mais ils ont l'air maladroits et parlent de bases de données spécifiques
java
transactions
isolation-level
Apprenant
la source
la source
Réponses:
Par exemple, vous avez 3 processus simultanés A, B et C. A démarre une transaction, écrit des données et valide / annule (selon les résultats). B exécute simplement une
SELECT
instruction pour lire les données. C lit et met à jour les données. Tous ces processus fonctionnent sur la même table T.WHERE aField > 10 AND aField < 20
- dire que A insère des données où laaField
valeur est comprise entre 10 et 20, puis B lit à nouveau les données et obtient un résultat différent.En utilisant JDBC, vous le définissez en utilisant
Connection#setTransactionIsolation
.Utilisation de Hibernate:
Où
La configuration Hibernate est prise à partir d' ici (désolé, c'est en espagnol).
En passant, vous pouvez également définir le niveau d'isolement sur le SGBDR:
SET ISOLATION TO DIRTY READ
phrase.)et ainsi de suite...
la source
Comme le dit brb tea, cela dépend de l'implémentation de la base de données et de l'algorithme qu'ils utilisent: MVCC ou Two Phase Locking.
CUBRID (SGBDR open source) explique l'idée de ces deux algorithmes:
Le MVCC permet des modifications simultanées au prix d'une surcharge accrue en mémoire (car il doit maintenir différentes versions des mêmes données) et en calcul (au niveau REPETEABLE_READ, vous ne pouvez pas perdre les mises à jour, il doit donc vérifier les versions des données, comme Hiberate fait avec Optimistick Locking ).
En 2PL niveaux d'isolement contrôlent les éléments suivants :
Exemples concrets de la relation entre verrous et niveaux d'isolement dans SQL Server (utilisez 2PL sauf sur READ_COMMITED avec READ_COMMITTED_SNAPSHOT = ON)
READ_UNCOMMITED: n'émettez pas de verrous partagés pour empêcher d'autres transactions de modifier les données lues par la transaction en cours. Les transactions READ UNCOMMITTED ne sont pas non plus bloquées par des verrous exclusifs qui empêcheraient la transaction actuelle de lire les lignes qui ont été modifiées mais non validées par d'autres transactions. [...]
READ_COMMITED:
REPETEABLE_READ: des verrous partagés sont placés sur toutes les données lues par chaque instruction de la transaction et sont conservés jusqu'à la fin de la transaction.
SERIALIZABLE: les verrous de plage sont placés dans la plage de valeurs de clé qui correspondent aux conditions de recherche de chaque instruction exécutée dans une transaction. [...] Les verrous de plage sont maintenus jusqu'à ce que la transaction se termine.
la source
Les verrous sont toujours pris au niveau DB: -
Document officiel d'Oracle: - Pour éviter les conflits lors d'une transaction, un SGBD utilise des verrous, des mécanismes pour bloquer l'accès par d'autres aux données auxquelles la transaction accède. (Notez qu'en mode de validation automatique, où chaque instruction est une transaction, les verrous sont maintenus pour une seule instruction.) Une fois qu'un verrou est défini, il reste en vigueur jusqu'à ce que la transaction soit validée ou annulée. Par exemple, un SGBD pourrait verrouiller une ligne d'une table jusqu'à ce que ses mises à jour aient été validées. L'effet de ce verrouillage serait d'empêcher un utilisateur d'obtenir une lecture incorrecte, c'est-à-dire de lire une valeur avant qu'elle ne soit rendue permanente. (L'accès à une valeur mise à jour qui n'a pas été validée est considéré comme une lecture incorrecte, car il est possible que cette valeur soit restaurée à sa valeur précédente. Si vous lisez une valeur qui est ultérieurement restaurée, vous aurez lu une valeur non valide. )
La façon dont les verrous sont définis est déterminée par ce que l'on appelle un niveau d'isolement des transactions, qui peut aller de la non prise en charge des transactions du tout à la prise en charge des transactions qui appliquent des règles d'accès très strictes.
Un exemple de niveau d'isolement de transaction est TRANSACTION_READ_COMMITTED, qui ne permettra pas d'accéder à une valeur tant qu'elle n'a pas été validée. En d'autres termes, si le niveau d'isolement des transactions est défini sur TRANSACTION_READ_COMMITTED, le SGBD n'autorise pas les lectures modifiées. L'interface Connection comprend cinq valeurs qui représentent les niveaux d'isolement des transactions que vous pouvez utiliser dans JDBC.
la source