web-dev-qa-db-fra.com

Quel est le lien entre les annotations Spring @Transactional et Hibernate @LockMode

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

14
vivek4348

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:

  • Des verrous explicites sont acquis sur chaque ligne modifiée sur les moteurs de base de données 2PL et MVCC. Les verrous partagés sont acquis sur les enregistrements lus sur les moteurs 2PL si vous utilisez la lecture répétable sur sérialisable.
  • Si vous avez défini un @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:

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.

18
Vlad Mihalcea

@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

3
ck1