Я пытался понять это в течение двух дней без успеха. Я использую транзакции на основе аннотаций в Spring 3.0.5 и Postgress. Я вызываю два метода дао из метода бизнес-логики:
@Transactional
public void registerTransaction(GoogleTransaction transaction) {
long transactionID = DBFactory.getTransactionDBInstance().addTransaction(transaction);
DBFactory.getGoogleTransactionDBInstance().addGoogleTransaction(transaction, transactionID);
}
Второй метод (addGoogleTransaction) выбрасывает RuntimeException в конце, однако транзакция не откатывается и обе строки вставляются.
Метод DAO выглядит следующим образом:
public void addGoogleTransaction(GoogleTransaction transaction, long id) {
log.trace("Entering addGoogleTransaction DAO method ");
log.trace(transaction.toString());
getSimpleJdbcTemplate().update(QRY_ADD_GOOGLE_TRANSACTION, new Object[] {id, transaction.getGoogleSerialNumber() ,
transaction.getGoogleBuyerID(), transaction.getGoogleOrderID()});
log.trace("Google transaction added successfully");
throw new RuntimeException();
}
Файл конфигурации Spring:
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven />
Нужно ли что-то настраивать? Я пытался добавить @Transactional к классу бизнес-логики и @Transactional к методам dao, но он тоже не работает.
Thanx
Он вызывается из класса контроллера (с аннотацией @Controller) для тестирования целей.
@RequestMapping(value = "/registration")
public String sendToRegistrationPage() throws ServiceException {
GoogleTransaction googleTransaction = new GoogleTransaction(0, "aei", new Date(), TransactionStatus.NEW, BigDecimal.ZERO, "", "", 0, "");
BillingFactory.getBillingImplementation("").registerTransaction(googleTransaction);
return "registration";
}