由于某些原因,我使用Spring PlatformTransactionManager手动执行了事务提交和回滚操作,现在我需要设置一个钩子,在事务提交后执行后置提交操作。
参考以下内容:
void commit(TransactionStatus status) throws TransactionException;
我无法确定除非没有抛出异常,否则如何确定交易是否成功。
我可以使用AOP作为一种选择,但是如何通过编程来实现呢?也许可以使用回调方法?
由于某些原因,我使用Spring PlatformTransactionManager手动执行了事务提交和回滚操作,现在我需要设置一个钩子,在事务提交后执行后置提交操作。
参考以下内容:
void commit(TransactionStatus status) throws TransactionException;
您可以通过更简单的方法获得所需内容,使用TransactionSynchronizationManager
和TransactionSynchronization
。
使用 TransactionSynchronizationManager
,您可以使用静态方法获取有关当前事务的信息,并且可以注册 TransactionSynchronization
,从而可以在调用时自动执行提交后操作。
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization(){
void afterCommit(){
//do what you want to do after commit
}
})
@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();
}
}
因此,不再拖延,以下是设置步骤:
在本示例中,我们假设您有一个Customer
实体和一个CustomerRepository
(和相应的ORM)。
首先,您需要一个新的事件类型NewCustomerEvent
:
// NewCustomerEvent.java
// Just a regular pojo for the event
public class NewCustomerEvent {
public String email;
// constructor, setters and getters omitted
}
@TransactionalEventListener
定义一个监听器。默认情况下,它会在成功提交后执行,但是可以使用phase
参数进行更改:// NewCustomerEventListener.java
@Component
public class NewCustomerEventListener {
@TransactionalEventListener
public void handleNewCustomerEvent(NewCustomerEvent newCustomerEvent) {
// handle new customer event
}
}
最后,您需要在交易服务中增加一个ApplicationEventPublisher
,并在所有交易语句发送完成后调用publish。
// CustomerRespositoryService.java
@Service
public class CustomerRepositoryService {
@Inject
private ApplicationEventPublisher applicationEventPublisher;
@Inject
private CustomerRepository customerRepository;
@Transactional
public void createCustomer(String email) {
Customer customer = new Customer(email);
customerRespotory.save(customer);
applicationEventPublisher.publish(new NewCustomerEvent(email));
}
}
另请参阅:
因为某些原因,在我的一个项目中我也不得不使用PlatformTransactionManager
。所以我被迫使用了org.springframework.transaction.support.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 {@Transactional
的主要原因是为了从代码中削减冗余和过于冗长的部分,这些部分并不适用。 - Enerccio
TransactionSynchronizationAdapter
作为实现单个方法的更简洁方式。 - AlexTransactionSynchronization
的所有方法,即使它只显示了一个。请查看我基于 @Alex 建议的答案。 - Michail MichailidisTransactionSynchronization
现在使用default
作为其方法的默认实现。因此,无需使用TransactionSynchronizationAdapter
。 - m.sarhan