Создание пост-фиксации при использовании транзакции в Spring - программирование
Подтвердить что ты не робот

Создание пост-фиксации при использовании транзакции в Spring

По каким-то причинам я вручную выполнил транзакцию фиксации и откат с помощью Spring PlatformTransactionManager, что мне нужно сделать, это настроить крючок, чтобы после совершения транзакции выполнялось действие фиксации по почте.

Посмотрев на:

 void commit(TransactionStatus status) throws TransactionException;

Я не могу видеть, как я могу определить, что транзакция была успешной, отличной от того, что она удаляла, поэтому, если не будет выбрано исключение.

И я мог бы использовать AOP как один из параметров, но как насчет того, что программа может сделать это, возможно, используя метод обратного вызова?

4b9b3361

Ответ 1

Вы можете получить именно то, что хотите, более простым способом: TransactionSynchronizationManager и TransactionSynchronization

С помощью TransactionSynchronizationManager у вас есть статические методы для получения информации о текущей транзакции, и вы можете зарегистрировать TransactionSynchronization, который позволяет автоматически выполнять пост-фиксацию, когда вы вызываете это

TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization(){
           void afterCommit(){
                //do what you want to do after commit
           }
})

Имейте в виду, что TransactionSynchronization используется для каждого потока (что часто не является проблемой для базового веб-запроса).

Ответ 2

Кредит на ответ Grooveek и комментарий Alex под ним - я ставлю это здесь, потому что комбинированные предложения обеспечивают надежное и чистое решение, которое сложно найти по сети.

Использование Spring 4+. если вам нужен обратный вызов по методу @Transactional после его успешного завершения, просто добавьте, что в начале метода:

@Service
public class OneService {

    @Autowired
    OneDao dao;

    @Transactional
    public void a transactionalMethod() {
        TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter(){
            public void afterCommit(){
                //do stuff right after commit
                System.out.println("commit!!!");

            }
        });
        //do db stuff
        dao.save();
    }
}

Ответ 3

В одном из моих проектов по определенным причинам мне также пришлось использовать PlatformTransactionManager. Поэтому я вынужден использовать org.springframework.transaction.support.TransactionTemplate.

http://static.springsource.org/spring/docs/2.0.x/api/org/springframework/transaction/support/TransactionTemplate.html

Главное преимущество заключается в том, что если вы правильно применили PlatformTransactionManager, вам не нужно беспокоиться о ручном коммите/откате. По крайней мере, исходный код TransactionTemplate может помочь вам, если вам нужна более конкретная вещь.

Это довольно просто использовать:

config.xml

<bean name="transactionTemplate"
            class="org.springframework.transaction.support.TransactionTemplate">
    <property name="transactionManager" ref="platformTransactionManager"/>
</bean>

MyServiceImpl.java

@Service
public class MyServiceImpl implements MyService {

    @Autowired
    private TransactionTemplate transactionTemplate;

    public Entity getSomethingWithTx(final long id) {

        return transactionTemplate.execute(new TransactionCallback<Entity>() {
            @Override
            public Entity doInTransaction(TransactionStatus status) {
                //TODO implement
            }
        });
    }