Je souhaite connaître la relation entre les transactions et les verrous.
Pour être plus précis, comment se porte @Transactional
lié au mode LockMode d'Hibernate. https://docs.jboss.org/hibernate/orm/4.0/devguide/en-US/html/ch05.html . http://docs.spring.io/autorepo/docs/spring/4.2.x/spring-framework-reference/html/transaction.html
Si je ne spécifie aucun verrou lors de la création d'un objet de session et utilise @Transactional
avec readOnly
comme false
, j'utilise Pessimistic Concurrenct Control.
Ce serait d'une grande aide, si quelqu'un peut me dire la relation entre le contrôle de concurrence (optimiste/pessimiste) et les transactions.
Merci, Vivek
Il n'y a pas de relation directe entre @Transactional
et @LockMode
annotations.
Comme expliqué dans cet article , @Transcational
est utilisé pour marquer les limites explicites d'une transaction RESOURCE_LOCAL ou JTA. La raison pour laquelle vous en avez besoin est que chaque instruction de base de données s'exécute dans un contexte transactionnel , et, si vous ne définissez pas les limites de transaction, vous obtiendrez une transaction par instruction ou auto- commettre.
D'autre part, @LockMode
sert à définir des options de verrouillage explicites. Si vous ne le définissez pas, les mécanismes de verrouillage implicites seront utilisés:
@Version
, le mécanisme de verrouillage optimiste implicite sera utilisé .Donc, @LockMode
sert à définir les options de verrouillage explicitement, et vous pouvez disposer des options suivantes:
LockModeType.OPTIMISTIC
LockModeType.OPTIMISTIC_FORCE_INCREMENT
LockModeType.PESSIMISTIC_FORCE_INCREMENT
LockModeType.PESSIMISTIC_READ
LockModeType.PESSIMISTIC_WRITE
Les modes de verrouillage PESSIMISTIC
acquerront toujours un verrou de base de données sur la ligne de table associée à l'entité verrouillée. Les modes de verrouillage OPTIMISTIC
sont destinés à vous donner un moyen d'augmenter une version d'entité même si l'entité n'a pas changé dans le contexte de persistance en cours d'exécution. C'est un mécanisme très utile lorsque vous devez coordonner plusieurs entités enfants en utilisant leur version d'entité parent .
Il y a beaucoup d'exemples dans les liens que j'ai fournis dans cette réponse, alors prenez votre temps, lisez-les tous et vous comprendrez tous ces concepts plus en détail.
@Transactional
et la classe LockMode
d'Hibernate sont différentes.
Spring Transaction Management
@Transactional
est une annotation Spring pour la gestion déclarative des transactions, c'est-à-dire la définition des instructions SQL qui sont exécutées ensemble à l'intérieur d'une transaction de base de données. L'utilisation de l'attribut readOnly
permet à Spring de lever une exception si vous essayez d'insérer des lignes à l'intérieur d'une transaction en lecture seule, par exemple.
En ce qui concerne le verrouillage, cependant, vous utiliserez très probablement une lecture/écriture (readOnly = false
), car vous tenterez de modifier les données.
Verrouillage pessimiste
Le LockMode
d'Hibernate est utilisé pour le verrouillage pessimiste, par ex. LockMode.UPGRADE
exécute en fait un SELECT...FOR UPDATE
, et verrouille la ligne de la base de données correspondant à l'entité.
Le verrouillage pessimiste suppose que les transactions simultanées entreront en conflit et nécessite que les ressources soient verrouillées après leur lecture et déverrouillées uniquement une fois que l'application a fini d'utiliser les données.
Verrouillage optimiste
Le contrôle de concurrence optimiste dans Hibernate utilise généralement une colonne de version ou d'horodatage dans la base de données. L'idée ici est que si plusieurs transactions tentent de modifier une ligne simultanément, toutes sauf la première transaction validée détecteront que le numéro de version a changé et effectueront une restauration.
Le verrouillage optimiste suppose que plusieurs transactions peuvent se terminer sans s’affecter mutuellement et que, par conséquent, les transactions peuvent se poursuivre sans verrouiller les ressources de données qu’elles affectent. Avant de valider, chaque transaction vérifie qu'aucune autre transaction n'a modifié ses données. Si le contrôle révèle des modifications conflictuelles, la transaction de validation est annulée.
Les citations ci-dessus proviennent de: https://docs.jboss.org/hibernate/orm/4.0/devguide/en-US/html/ch05.html