1、事务提交后执行
场景如下:
- 异步-记录日志:当事务提交后,再记录日志。
- 发送mq消息:只有业务数据都存入表后,再发mq消息。
2、spring实现
//1、存在事务为true,不存在事务为false。
boolean flag = TransactionSynchronizationManager.isActualTransactionActive();
if (flag) {
//1.1 存在事务
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
@Override
public void afterCommit() {
//执行事务提交后流程
log.info("事务提交后");
handle();
}
});
return;
}
//1.2 不存在事务
log.info("不存在事务");
handle();- TransactionSynchronizationManager.isActualTransactionActive()判断是否处于事务中。
afterCommit为事务提交后执行。
3、 TransactionSynchronization
3.1 源码
在上面的 TransactionSynchronizationManager 类中我们知道,事务操作的时候它的当前线程还保存了 TransactionSynchronization 对象。而这个对象伴随着 Spring 对 事务处理的各个生命周期都会有相应的扩展。
public interface TransactionSynchronization extends Flushable {
/** 事务提交状态 */
int STATUS_COMMITTED = 0;
/** 事务回滚状态 */
int STATUS_ROLLED_BACK = 1;
/**系统异常状态 */
int STATUS_UNKNOWN = 2;
void suspend();
void resume();
void flush();
// 事务提交之前
void beforeCommit(boolean readOnly);
// 事务成功或者事务回滚之前
void beforeCompletion();
// 事务成功提交之后
void afterCommit();
// 操作完成之后(包含事务成功或者事务回滚)
void afterCompletion(int status);
}版权声明:本文为xixingzhe2原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。