程序员的知识教程库

网站首页 > 教程分享 正文

事务的事务扩展TransactionSynchronizationManager

henian88 2025-03-25 13:24:35 教程分享 12 ℃ 0 评论

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,并且不会占用数据库连接资源。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表