我使用JDBCTemplate
在事务中进行插入+更新。
问题是我必须以编程方式设置主键,我从一个跟踪主键的表中读取。
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
最后getNextId()
获得下一个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();
}
基本上我希望所有这些插入/更新全部或全部完成,但是这个getNextId()我需要提交而不管外部事务(因为保留下一个主键)。
我的问题是,对于在方法PROPAGATION_REQUIRES_NEW
中运行的事务,传播getNextId()
是正确的吗?
答案 0 :(得分:1)
是。如果您使用PROPAGATION.REQUIRES_NEW
,则暂停当前交易(如果有),并创建新交易。一旦该事务的执行完成,如果没有错误发生,则将提交它,并且将恢复外部事务。无论接下来发生什么,内部事务都已提交,现在是独立的。
在上面的代码中,请确保已使用正确的传播模式配置transactionTemplate
,即:
transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);