JDBCTemplate事务中的多个语句 - 传播

时间:2014-05-13 19:54:22

标签: spring transactions jdbctemplate spring-transactions

我使用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()是正确的吗?

1 个答案:

答案 0 :(得分:1)

是。如果您使用PROPAGATION.REQUIRES_NEW,则暂停当前交易(如果有),并创建新交易。一旦该事务的执行完成,如果没有错误发生,则将提交它,并且将恢复外部事务。无论接下来发生什么,内部事务都已提交,现在是独立的。

在上面的代码中,请确保已使用正确的传播模式配置transactionTemplate,即:

transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);