没有执行SQL时弹簧事务回滚

时间:2014-05-08 15:54:30

标签: java spring spring-jdbc

我想知道如果 orderId 为空,是否需要回滚以下内容,并且以下SQL语句永远不会运行?这是一个稍大的方法的简化示例。

我想知道如果启动一个事务,但由于orderId为null而没有做任何事情,应该以某种方式终止。

public OrderInfo insertOrder(String orderId) throws OrderException {
    OrderInfo orderInfo = null;
    DefaultTransactionDefinition txnDefinition = new DefaultTransactionDefinition();
    txnDefinition.setName("InsertOrder");
    txnDefinition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
    TransactionStatus txnStatus = transactionManager.getTransaction(txnDefinition);

    if (orderId != null && !orderId.isEmpty()) {
        try {
            orderInfo = orderDao.insertOrder(orderId);

            if (orderInfo != null && orderInfo.getOrderId() > 0) {
                transactionManager.commit(txnStatus);
            }
            else {
                transactionManager.rollback(txnStatus);
                throw new OrderException();
            }
        } catch (Exception e) {
            transactionManager.rollback(txnStatus);
            throw new OrderException();
        }
    }

// else rollback?

    return orderInfo;
}

1 个答案:

答案 0 :(得分:1)

我建议尝试Spring TransactionTemplate

    TransactionTemplate tt = new TransactionTemplate(transactionManager, transactionDefinition);
    OrderInfo orderInfo = tt.execute(new TransactionCallback<OrderInfo>() {
        @Override
        public T doInTransaction(TransactionStatus status) {
            return orderDao.insertOrder(orderId);
        }
    });

这是保证所有事情都能正确完成