2010-11-22 6 views
0

J'ai une seule méthode de service annotée avec Propagation.Required. Il effectue trois opérations distinctes.Transactions de déclaration automatique et de déclaration de source

  1. Insérer le tableau 1 de la table z si aucun enregistrement ne dans le tableau 1
  2. Insérer/table de mise à jour 1 par utilisateur les modifications/ajouts
  3. Supprimer des enregistrements de x à partir du tableau 1

Pardonne mon ignorance, mais ne devrait-elle pas tous se dérouler dans une seule transaction? En ce sens, si la troisième requête se heurte à une exception, ne devrait-elle pas également être la première annulation? Cela n'arrive pas dans mon cas. Est-ce que la mise en veille automatique mise en veille affectera les limites de txn de quelque façon que ce soit? La validation automatique est définie sur true dans mon cas. Ce dont j'ai besoin, c'est que la validation ne puisse avoir lieu dans aucune de ces tables si tous ont réussi.

+1

Nous n'avons aucune chance de vous répondre sans voir votre code et votre configuration. – skaffman

Répondre

0

Oui, le paramètre de propriété Hibernate connection.autocommit affectera les limites de transaction.

Si vous définissez cette valeur sur true, Hibernate mettra la connexion JDBC sous-jacente en mode autocommit, ce qui encapsulera chaque instruction exécutée dans sa propre transaction de base de données. Par exemple, si votre troisième requête/instruction échoue, seule votre troisième requête/instruction sera annulée.

Pour exécuter les trois en tant qu'unité unique, vous devez désactiver l'autocommit et exécuter les trois dans le contexte d'une seule transaction, déclarative ou non.

1

pouvez-vous essayer d'ajouter une couche de plus que la couche de service et démarrer la transaction à partir de là.

0

Vous ne voulez certainement pas d'auto-validation. Cela va probablement commettre après chaque opération. Désactivez autocommit et ajoutez un commit explicite à la fin.