Мне интересно, если мне нужно откат следующего, если orderId имеет значение NULL, и следующий оператор 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;
}
Я предлагаю попробовать 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);
}
});
это гарантия того, что все будет сделано правильно