java spring 事务提交_Spring 事务提交之后再执行操作
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 事务提交之后再执行操作相关推荐
- java spring 事务传播_spring事务传播机制实例讲解
天温习spring的事务处理机制,总结如下 对于SQL事务的概念以及ACID性质,可以参见我的另一篇博文 http://kingj.iteye.com/admin/blogs/1675011 spri ...
- spring的事务隔离_spring事务基础及常见问题详解
一:基础知识介绍 1.1:事务四个特性:ACID 原子性(Atomicity):事务是一个原子操作,由一系列动作组成.事务的原子性确保动作要么全部完成,要么全部失败. 一致性(Consistency) ...
- 事务例子_Spring事务专题(四)Spring中事务的使用、抽象机制及模拟Spring事务实现...
Spring中事务的使用示例.属性及使用中可能出现的问题 前言 本专题大纲如下: 「对于专题大纲我又做了调整哈,主要是希望专题的内容能够更丰富,更加详细」,本来是想在源码分析的文章中附带讲一讲事务使用 ...
- java事务类型_Spring事务类型祥解
大家可能在spring中经常看到这样的定义: PROPAGATION_REQUIRED,readOnlyPROPAGATION_REQUIRED 估计有好多朋友还没有弄清楚里面的值的意思,仔细看完下面 ...
- java spring redis订阅_spring中订阅redis键值过期消息通知
1.首先启用redis通知功能(ubuntu下操作): 编辑/etc/redis/redis.conf文件,添加或启用以下内容(过期通知): notify-keyspace-events Ex 或者登 ...
- java 回滚异常_Spring事务管理只对出现运行期异常进行回滚
Spring的事务管理默认只对出现运行期异常(java.lang.RuntimeException及其子类)进行回滚. 如果一个方法抛出Exception或者Checked异常,Spring事务管理默 ...
- java 数据库 事务 只读_Spring 事务 readOnly 到底是怎么回事?
Spring的事务经常会有这样的配置: 1 或者这样的注记: 1 @Transactional(readOnly = true) 正好我正在做的项目中这样配置了,而且偶然发现配置了不生效,本着&quo ...
- java spring框架 注解_spring框架之注解的使用
原标题:spring框架之注解的使用 今天是刘小爱自学Java的第122天. 感谢你的观看,谢谢你. 学习内容安排如下: Spring注解的使用. JavaWeb项目的搭建. Spring的Web集成 ...
- java spring mvc 实例_spring mvc 简单实例
转至:http://blog.csdn.net/dingx/article/details/2242105 Spring Framework可以被使用在很多场合之中,考虑到目前大多数Java EE的项 ...
最新文章
- oracle12C要求aix系统版本,Oracle 12c RAC for AIX7.1(三)系统参数
- 【抢鲜版】ArcGIS 10.7手把手经典图文安装教程(附安装包下载地址)
- CCIE理论-第二篇-SDN-FabricPath技术
- springboot 2.3_Spring Boot 应用监控,早发现早
- InternetCheckConnection 通过尝试连接特定的网址,可以用来判断目前机器是否接通外网
- 功能测试常用6种方法_云端功能测试:更好的12种方法
- python中formatter的用法_python中 logging的使用详解
- windows7创建wlan热点分享网络
- OpenLayers 3实践与原理探究1-ol2 VS ol3
- 天猫商城自动化python脚本(仅供初学者学习使用)
- 多任务学习——【ICML 2018】GradNorm
- Hadoop2.x与3.x的区别:
- IOS UITableView 改变编辑模式下的移动图标
- 网站结构优化要做好哪些
- 如何查看磁盘是GUID格式(GPT)还是MBR格式?判别UEFI模式启动,还是Legacy模式启动?
- 微信公众号网页授权域名时报内容与下载文件不符,请检查文件内容或重新上传原始文件的错误解决方法
- 那个人总有一天会爱你
- 气动调节阀的用途安装知识
- Java房地产销售管理系统_JAVA JSP房地产销售系统 源代码 论文
- 解决 input 文件上传不能上传重复文件的问题