TransactionSynchronization事务同步回调接口,用于在事务执行过程中的重要时间点执行额外的逻辑,AbstractPlatformTransactionManager中通过TransactionSynchronizationManager间接调用绑定到当前事务所在线程的TransactionSynchronization集合的对应的回调方法。
TransactionSynchronizationManager使用ThreadLocal管理当前事务的TransactionSynchronization集合。
ResourceHolderSynchronization是用来同步资源状态的,这里的资源就是Spring 事务框架中的资源的概念,就是JDBC里的Connection,Hibernate里的Session,JPA里的EntityManager,Kafka里的Producer。
ResourceHolderSynchronization,比如KafkaResourceSynchronization提供的能力是当前ResourceHolderSynchronization(KafkaResourceSynchronization)对象所绑定的事务完成之后,间接调用kafka的Producer的commitTransaction或者abortTransaction方法。
相关代码:
@Transactional
public void doTx() {
//创建订单
//扣减库存
//发送消息到MQ
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization(){
@Override
public void afterCompletion() {
// send MQ... RPC...
}
});
}
事务的事务扩展项目中的应用场景是当订单成功之后,发送一条消息到 MQ 当中去。由于事务是和数据库连接相绑定的,如果把发送消息和数据库操作放在一个事务里面。当发送消息时间过长时会占用数据库连接,所以就要把数据库操作与发送消息到 MQ 解耦。
可以利用 TransactionSynchronization里边的方法,当数据成功保存到数据库并且事务提交了就把消息发送到 MQ 里面。