关于java:支付宝一面多线程事务怎么回滚说用-Transactional-可以回去等通知了
背景介绍1,最近有一个大数据量插入的操作入库的业务场景,须要先做一些其余批改操作,而后在执行插入操作,因为插入数据可能会很多,用到多线程去拆分数据并行处理来进步响应工夫,如果有一个线程执行失败,则全副回滚。 2,在spring中能够应用@Transactional注解去管制事务,使出现异常时会进行回滚,在多线程中,这个注解则不会失效,如果主线程须要先执行一些批改数据库的操作,当子线程在进行解决出现异常时,主线程批改的数据则不会回滚,导致数据谬误。 3,上面用一个简略示例演示多线程事务。 专用的类和办法/** * 均匀拆分list办法. * @param source * @param n * @param <T> * @return */public static <T> List<List<T>> averageAssign(List<T> source,int n){ List<List<T>> result=new ArrayList<List<T>>(); int remaider=source.size()%n; int number=source.size()/n; int offset=0;//偏移量 for(int i=0;i<n;i++){ List<T> value=null; if(remaider>0){ value=source.subList(i*number+offset, (i+1)*number+offset+1); remaider--; offset++; }else{ value=source.subList(i*number+offset, (i+1)*number+offset); } result.add(value); } return result;}/** 线程池配置 * @version V1.0 */public class ExecutorConfig { private static int maxPoolSize = Runtime.getRuntime().availableProcessors(); private volatile static ExecutorService executorService; public static ExecutorService getThreadPool() { if (executorService == null){ synchronized (ExecutorConfig.class){ if (executorService == null){ executorService = newThreadPool(); } } } return executorService; } private static ExecutorService newThreadPool(){ int queueSize = 500; int corePool = Math.min(5, maxPoolSize); return new ThreadPoolExecutor(corePool, maxPoolSize, 10000L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(queueSize),new ThreadPoolExecutor.AbortPolicy()); } private ExecutorConfig(){}}/** 获取sqlSession * @author 86182 * @version V1.0 */@Componentpublic class SqlContext { @Resource private SqlSessionTemplate sqlSessionTemplate; public SqlSession getSqlSession(){ SqlSessionFactory sqlSessionFactory = sqlSessionTemplate.getSqlSessionFactory(); return sqlSessionFactory.openSession(); }}举荐一个 Spring Boot 基础教程及实战示例:https://github.com/javastacks/spring-boot-best-practice ...