事务流程控制的编程实现:事务的事务扩展TransactionSynchronizationManager
事务流程控制的编程实现:事务的事务扩展TransactionSynchronizationManagernew TransactionSynchronizationAdapter(){TransactionSynchronizationManager.registerSynchronization(// 修改订单成功updateOrderSuccess(order);// 发送消息到 MQ
spring 对于事务的管理都是基于 TransactionSynchronizationManager
spring中在一个有事务的方法中,等事务提交后调另一个方法(TransactionSynchronizationManager.registerSynchronization)
@Transactional
public void finishorder(Order order){
// 修改订单成功
updateOrderSuccess(order);
// 发送消息到 MQ
TransactionSynchronizationManager.registerSynchronization(
new TransactionSynchronizationAdapter(){
@Override
public void afterCommit() {
mqService.send(order);
}
});
}
TransactionSynchronization 的 代码说明
public interface TransactionSynchronization extends Flushable {
/** 事务提交状态 */
int STATUS_COMMITTED = 0;
/** 事务回滚状态 */
int STATUS_ROLLED_BACK = 1;
/**系统异常状态 */
int STATUS_UNKNOWN = 2;
//在spring开启新事务,获取connection之前会调用(未执行registCustomer)
void suspend();
//开启新事务失败时会调用(未执行registCustomer)
void resume();
//没调用
void flush();
// 事务提交之前
void beforeCommit(boolean readOnly);
// 事务成功或者事务回滚之前
void beforeCompletion();
// 事务成功提交之后
void afterCommit();
// 操作完成之后(包含事务成功或者事务回滚)
void afterCompletion(int status);
}
问题: 为什么要用这个拓展功能?
事务的事务扩展项目中的应用场景是
当订单成功之后,发送一条消息到 MQ 当中去。
由于事务是和数据库连接相绑定的,如果把发送消息和数据库操作放在一个事务里面。
当发送消息时间过长时会占用数据库连接,所以就要把数据库操作与发送消息到 MQ 解耦开来。
可以利用 TransactionSynchronization#afterCommit 的这个方法,当数据成功保存到数据库并且事务提交了就把消息发送到 MQ 里面。
当事务成功提交之后,就会把消息发送给 MQ,并且不会占用数据库连接资源。