Domanda

Ho un singolo metodo di servizio annotato con Propagation.Required. Svolge tre operazioni separate.

  1. Inserisci per tabella 1 dalla tabella z se nessun record sono nella tabella 1
  2. Inserisci / Aggiorna tabella 1 come per utente modifiche / aggiunte
  3. x Elimina i record dalla Tabella 1

Perdonate la mia ignoranza, ma non dovrebbe correre tutti questi sotto una singola transazione? Nel senso, se il terzo query viene eseguita in un'eccezione, non dovrebbe il primo e secondo rollback troppo? Questo non accade nel mio caso. Sarà hibernate commit automatico impostazione influenzare i confini TXn in qualche modo? Commit automatico è impostato su true nel mio caso. Che cosa ho bisogno è il commit dovrebbe avvenire in una qualsiasi di queste tabelle solo se tutti hanno successo.

È stato utile?

Soluzione

Sì, l'impostazione della proprietà connection.autocommit Hibernate influenzerà limiti della transazione.

Se si imposta a true, Hibernate metterà la connessione JDBC sottostante in modalità autocommit, che vi avvolgerà ogni istruzione si esegue nella propria transazione di database.

Quindi, per esempio, se la terza interrogazione / istruzione ha esito negativo, solo la tua terza domanda / dichiarazione otterrà rollback.

Per eseguire tutti e tre come una singola unità, è necessario disporre di autocommit fuori ed eseguire tutti e tre nel contesto di una singola transazione, dichiarativa o in altro modo.

Altri suggerimenti

si potrebbe provare ad aggiungere uno strato più alto di livello di servizio e avviare la transazione da lì.

È sicuramente non si desidera autocommit su. Che probabilmente commit dopo ogni operazione. Interruttore autocommit fuori, e aggiungere un esplicito commit alla fine.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top