2014-05-13 4 views
0

Je fais une insertion + quelques mises à jour dans une transaction en utilisant JDBCTemplate. La chose est que je dois définir la clé primaire par programmation que je lis d'une table qui garde la trace des clés primaires.JDBCTemplate instructions multiples dans Transaction - propagation

public void insert(final COrder cOrder) { 
    transactionTemplate.execute(new TransactionCallbackWithoutResult() { 
     public void doInTransactionWithoutResult(TransactionStatus status) { 
      Long cOrderId = insertOrder(cOrder); 
      insertOrderLines(cOrder, cOrderId); 
      insertCOrderTaxes(cOrder, cOrderId); 
      updateMStorage(cOrder); 
      insertMTransactions(cOrder); 
     } 
    }); 
} 

public Long insertOrder(COrder o) { 
    Long cOrderId = getNextId("C_ORDER"); 
    o.setcOrderId(cOrderId); 
      ... 
} 
//the above insert methods here 

et enfin getNextId() qui obtient le prochain id.

public synchronized Long getNextId(final String tableName) { 
     final IdHolder idHolder = new IdHolder(-1l); 
     transactionTemplate.execute(new TransactionCallbackWithoutResult() { 
      public void doInTransactionWithoutResult(TransactionStatus status) { 
       Long nextId = jdbcTemplate.queryForObject("SELECT CURRENTNEXT FROM AD_SEQUENCE WHERE NAME=?", 
         new String[] { tableName }, Long.class); 
       jdbcTemplate.update("UPDATE AD_SEQUENCE SET CURRENTNEXT = CURRENTNEXT + 1 WHERE NAME=?", 
         new Object[] { tableName }); 
       idHolder.setId(nextId); 
      } 
     }); 
     return idHolder.getId(); 
    } 

Fondamentalement, je veux toutes ces insertions/mises à jour effectuées tout ou rien, mais ce getNextId() je dois engager quelle que soit la transaction externe (en raison de réserver la prochaine clé primaire).

Ma question est, est la propagation PROPAGATION_REQUIRES_NEW le bon pour Transaction qui fonctionne dans la méthode getNextId()?

Répondre

1

Oui. Si vous utilisez PROPAGATION.REQUIRES_NEW, la transaction en cours, le cas échéant, sera mise en pause et une nouvelle transaction sera créée. Une fois l'exécution de cette transaction terminée, elle sera validée si aucune erreur ne se produit et que la transaction externe sera reprise. Peu importe ce qui se passe ensuite, la transaction interne est engagée et est maintenant indépendante.

Dans votre code ci-dessus, assurez-vous que votre transactionTemplate a été configuré avec le mode de propagation à droite, qui est la suivante:

transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); 
+0

Merci pour le Setphane de confirmation. Pour le paramètre de comportement de propagation, j'ai configuré deux TransactionTemplates dans le contexte Spring. Pour le TransactionTemplate interne, j'ai défini la propriété \t '' – isah

Questions connexes