Весенний откат транзакции - PullRequest
       4

Весенний откат транзакции

2 голосов
/ 21 сентября 2011

Я пытался понять это в течение двух дней без успеха. Я использую транзакции на основе аннотаций в 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";
}

1 Ответ

1 голос
/ 21 сентября 2011

Я не совсем уверен, что делает BillingFactory.getBillingImplementation("").Это простая фабрика Java или она возвращает сервис Spring из контекста приложения?Я также не уверен, что у вас есть транзакционные прокси-серверы Spring - если нет, то, что вы делаете, скорее всего, с автокоммитом.Я думаю, что было бы неплохо включить ведение журнала для пакета org.springframework.transaction.

На самом деле я бы ожидал что-то вроде:

@Controller
public class MyController {

    @Resource
    private BillingService billingService;

    @RequestMapping(value = "/registration")
    public String sendToRegistrationPage() throws ServiceException {
        GoogleTransaction googleTransaction = new GoogleTransaction(0, "aei", new Date(), TransactionStatus.NEW, BigDecimal.ZERO, "", "", 0, "");
        billingService.registerTransaction(googleTransaction);
        return "registration";
    }
}

А в вашей конфигурации Spring что-то вроде (или какой-нибудь @Service аннотированный боб):

<bean id="billingService" class="foo.bar.BillingImplementation" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...