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()
?
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