Как мы можем сделать внешний звонок без текущей транзакции? - PullRequest
1 голос
/ 02 февраля 2011

Мы используем Spring & Hibernate в JBoss 4.2.3 и вызываем внешнюю систему, которая может занять некоторое время, как часть обработки запросов. Чтобы устранить долгоживущие блокировки базы данных, мы не будем писать в нашу базу данных до тех пор, пока не будет возвращен внешний вызов. Но Hibernate не любит быть без транзакции, поэтому у нас есть транзакция только для чтения, начатая Spring, пока мы не сделаем наши записи (в новой субтранзакции чтения-записи). К сожалению, это все еще означает, что мы сохраняем ресурсы во время внешнего вызова, выделенное соединение из пула. Есть ли способ сделать внешний вызов без текущей транзакции, когда остальная часть выполнения (до и после) нужна? Есть ли лучший способ отложить реальную транзакцию до тех пор, пока она нам действительно не понадобится, и при этом сохранить Hibernate счастливым?

Ответы [ 2 ]

0 голосов
/ 16 марта 2011

На самом деле транзакция для чтения не нужна.

Вот пример, где вызов read направляется прямо к объекту DAO, но вызов write выполняется внутри транзакции (с использованием вспомогательного объекта Spring TransactionTemplate):

public ContainerType getContainerType(Long id) {
    return this.containerTypeDao.getContainerType(id);
}

public Long saveContainerType(final ContainerType containerType) {
    return (Long) this.transactionTemplate.execute(new TransactionCallback() {

        public Long doInTransaction(TransactionStatus status) {
            try {
                return containerTypeDao.saveContainerType(containerType);
            }
            catch (Exception e) {
                status.setRollbackOnly();
                return null;
            }
        }
    });
}
0 голосов
/ 02 февраля 2011

Нужно ли вызывать внешнюю систему в вашем слое постоянства? Кажется более логичным делать подобные вещи снаружи, прежде чем вы достигнете настойчивости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...