Spring代码实现:

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.stereotype.Component;

import org.springframework.transaction.support.TransactionSynchronizationAdapter;

import org.springframework.transaction.support.TransactionSynchronizationManager;

import java.util.ArrayList;

import java.util.List;

import java.util.concurrent.Executor;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

/**

* 事务完成之后再执行操作

*/

@Component

public class AfterCommitExecutor extends TransactionSynchronizationAdapter implements Executor{

private static final Logger LOGGER = LoggerFactory.getLogger(AfterCommitExecutorImpl.class);

private static final ThreadLocal> RUNNABLES = new ThreadLocal>();

private ExecutorService threadPool = Executors.newFixedThreadPool(5);

@Override

public void execute(Runnable runnable) {

LOGGER.info("Submitting new runnable {} to run after commit", runnable);

if (!TransactionSynchronizationManager.isSynchronizationActive()) {

LOGGER.info("Transaction synchronization is NOT ACTIVE. Executing right now runnable {}", runnable);

runnable.run();

return;

}

List threadRunnables = RUNNABLES.get();

if (threadRunnables == null) {

threadRunnables = new ArrayList();

RUNNABLES.set(threadRunnables);

TransactionSynchronizationManager.registerSynchronization(this);

}

threadRunnables.add(runnable);

}

@Override

public void afterCommit() {

List threadRunnables = RUNNABLES.get();

LOGGER.info("Transaction successfully committed, executing {} runnables", threadRunnables.size());

for (int i = 0; i < threadRunnables.size(); i++) {

Runnable runnable = threadRunnables.get(i);

LOGGER.info("Executing runnable {}", runnable);

try {

threadPool.execute(runnable);

} catch (RuntimeException e) {

LOGGER.error("Failed to execute runnable " + runnable, e);

}

}

}

@Override

public void afterCompletion(int status) {

LOGGER.info("Transaction completed with status {}", status == STATUS_COMMITTED ? "COMMITTED" : "ROLLED_BACK");

RUNNABLES.remove();

}

}

调用:

@Service

@Trasaction

public class MyService {

@Autowired

private AfterCommitExecutor afterCommitExecutorImpl;

public void test() {

//TODO 业务功能

//事务提交后执行

afterCommitExecutor.execute(new Runnable() {

@Override

public void run() {

//TODO 事务提交后功能

}

});

}

}

java spring 事务提交_Spring 事务提交之后再执行操作相关推荐

  1. java spring 事务传播_spring事务传播机制实例讲解

    天温习spring的事务处理机制,总结如下 对于SQL事务的概念以及ACID性质,可以参见我的另一篇博文 http://kingj.iteye.com/admin/blogs/1675011 spri ...

  2. spring的事务隔离_spring事务基础及常见问题详解

    一:基础知识介绍 1.1:事务四个特性:ACID 原子性(Atomicity):事务是一个原子操作,由一系列动作组成.事务的原子性确保动作要么全部完成,要么全部失败. 一致性(Consistency) ...

  3. 事务例子_Spring事务专题(四)Spring中事务的使用、抽象机制及模拟Spring事务实现...

    Spring中事务的使用示例.属性及使用中可能出现的问题 前言 本专题大纲如下: 「对于专题大纲我又做了调整哈,主要是希望专题的内容能够更丰富,更加详细」,本来是想在源码分析的文章中附带讲一讲事务使用 ...

  4. java事务类型_Spring事务类型祥解

    大家可能在spring中经常看到这样的定义: PROPAGATION_REQUIRED,readOnlyPROPAGATION_REQUIRED 估计有好多朋友还没有弄清楚里面的值的意思,仔细看完下面 ...

  5. java spring redis订阅_spring中订阅redis键值过期消息通知

    1.首先启用redis通知功能(ubuntu下操作): 编辑/etc/redis/redis.conf文件,添加或启用以下内容(过期通知): notify-keyspace-events Ex 或者登 ...

  6. java 回滚异常_Spring事务管理只对出现运行期异常进行回滚

    Spring的事务管理默认只对出现运行期异常(java.lang.RuntimeException及其子类)进行回滚. 如果一个方法抛出Exception或者Checked异常,Spring事务管理默 ...

  7. java 数据库 事务 只读_Spring 事务 readOnly 到底是怎么回事?

    Spring的事务经常会有这样的配置: 1 或者这样的注记: 1 @Transactional(readOnly = true) 正好我正在做的项目中这样配置了,而且偶然发现配置了不生效,本着&quo ...

  8. java spring框架 注解_spring框架之注解的使用

    原标题:spring框架之注解的使用 今天是刘小爱自学Java的第122天. 感谢你的观看,谢谢你. 学习内容安排如下: Spring注解的使用. JavaWeb项目的搭建. Spring的Web集成 ...

  9. java spring mvc 实例_spring mvc 简单实例

    转至:http://blog.csdn.net/dingx/article/details/2242105 Spring Framework可以被使用在很多场合之中,考虑到目前大多数Java EE的项 ...

最新文章

  1. oracle12C要求aix系统版本,Oracle 12c RAC for AIX7.1(三)系统参数
  2. 【抢鲜版】ArcGIS 10.7手把手经典图文安装教程(附安装包下载地址)
  3. CCIE理论-第二篇-SDN-FabricPath技术
  4. springboot 2.3_Spring Boot 应用监控,早发现早
  5. InternetCheckConnection 通过尝试连接特定的网址,可以用来判断目前机器是否接通外网
  6. 功能测试常用6种方法_云端功能测试:更好的12种方法
  7. python中formatter的用法_python中 logging的使用详解
  8. windows7创建wlan热点分享网络
  9. OpenLayers 3实践与原理探究1-ol2 VS ol3
  10. 天猫商城自动化python脚本(仅供初学者学习使用)
  11. 多任务学习——【ICML 2018】GradNorm
  12. Hadoop2.x与3.x的区别:
  13. IOS UITableView 改变编辑模式下的移动图标
  14. 网站结构优化要做好哪些
  15. 如何查看磁盘是GUID格式(GPT)还是MBR格式?判别UEFI模式启动,还是Legacy模式启动?
  16. 微信公众号网页授权域名时报内容与下载文件不符,请检查文件内容或重新上传原始文件的错误解决方法
  17. 那个人总有一天会爱你
  18. 气动调节阀的用途安装知识
  19. Java房地产销售管理系统_JAVA JSP房地产销售系统 源代码 论文
  20. 解决 input 文件上传不能上传重复文件的问题

热门文章

  1. 《二》Android 数据库 SQlite SQLiteOpenHelper
  2. encoder decoder模型_机器学习11 -- 无监督学习之Auto-Encoder
  3. C语言之10/16进制字符串和数字转换(四)
  4. J2EE技术-Hibernate
  5. Java写file文件上传,在线预览思路
  6. CentOS7安装了nginx后启动本机访问不到
  7. ubuntu查看进程和结束进程
  8. 不清楚SBUS,这份SBUS协议详解请收藏
  9. hbase中的master启动后自动关闭
  10. 在win10系统下安装ubuntu17.10以及基本配置