Java多线程导致的的一个事物性问题
业务场景
我们如今有一个类似于文件上传的功能。各个子网站接受业务,业务上传文件,各个子网站的文件须要提交到总网站保存。文件是按批次提交到总网站的,也就是说,一个批次以下约有几百个文件。
考虑到白天提交这么多文件会影响到子网站其它系统带宽,我们将分网站的文件提交到总网站这个操作过程独立出来,放到晚上来做,详细时间是晚上7:00到早上7:00。
这个操作过程我们暂且称作“排程”。 排程在执行之后,先获取全部须要上传到总网站的批次信息,拿到批次信息之后。将这个批次表的状态置为正在同步数据。这个时候。假设这个批次再有业务人员上传文件。发现批次正在同步。就会返回操作失败。
如今产生的问题:
1,排程获取到批次,准备将批次表状态置为正在同步,注意这时候批次表还没有改成正在同步。
2,业务人员对这个批次提交100张文件,因为批次表状态还没改成正在同步。所以校验通过,准备插入数据到数据库,注意这时候文件信息还没插入到数据库,仅仅是准备插入。
3,排程将批次表信息置为正在同步,而且获取到批次以下全部文件信息保存到内存,准备一个一个上传文件。
4,业务人员上传的文件信息成功保存到数据库。
这样的情况下,就会导致。第四步保存到数据库中的文件信息并没有提交到总网站。
分析:
大家没看懂上面的业务信息,没关系,我们能够以一种更通俗的方式来描写叙述:
我们去电影院看3D电影, 假如电影是在9:00开播, 9:00之后演播大厅关门,然后服务人员给全部坐在位子上的人发一个滤光眼镜。这时候就会有一个问题。那些正在走向位子上的人怎么办? 这就是我们如今的问题。
我们想到2种解决方式:
1: 我们关上门之后等待一段时间,让全部的人都走到位子上。之后服务人员再发眼镜。
2:服务人员每隔一段时间就检測下,有没有坐在位子上的人没有眼镜,没有眼镜就发一个。
注意:业务场景看电影的人是没办法主动要眼镜的 J
假设使用另外一种方法,我们几十个分网站会频繁訪问总网站查询数据。这个查询是全表扫描,这对数据库性能影响太大。考虑到这个排程进程是后台进程。第一种方法尽管处理慢点,可是对系统影响更小,并且在一定程度上会减缓server的CPU压力,终于我们选择了第一种方案。
希望能对你有帮助。
Java多线程导致的的一个事物性问题的更多相关文章
- java多线程并发去调用一个类的静态方法安全性探讨
java多线程并发去调用一个类的静态方法安全性探讨 转自:http://blog.csdn.net/weibin_6388/article/details/50750035 这篇文章主要讲多线程对 ...
- [转]java多线程并发去调用一个类的静态方法安全性探讨
文章转自:https://blog.csdn.net/weibin_6388/article/details/50750035 这篇文章主要讲多线程对静态方法访问的数据安全性 总结如下: 1,java ...
- Java多线程系列——锁的那些事
引入 Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率. 下面先带大家来总体预览一下锁的分类图 java锁的具体实现类 1.乐观锁 VS 悲观锁 乐观锁与悲观锁是 ...
- java 多线程 Callable -- 分段处理一个大的list 然后再合并结果
本文代码参考 http://bbs.csdn.net/topics/391070227?page=1 下面是贴出的代码: public void dealListWithMutiThread(){ L ...
- java多线程下如何调用一个共同的内存单元(调用同一个对象)
/* * 关于线程下共享相同的内存单元(包括代码与数据) * ,并利用这些共享单元来实现数据交换,实时通信与必要的同步操作. * 对于Thread(Runnable target)构造方法创建的线程, ...
- Java多线程学习——死锁的一个容易理解的例子
发生死锁的情况:多个线程需要同时占用多个共享资源而发生需要互相死循环等待的情况 public class Mirror { //镜子 } public class Lipstick { //口红 } ...
- Java多线程基础知识篇
这篇是Java多线程基本用法的一个总结. 本篇文章会从一下几个方面来说明Java多线程的基本用法: 如何使用多线程 如何得到多线程的一些信息 如何停止线程 如何暂停线程 线程的一些其他用法 所有的代码 ...
- JAVA多线程学习笔记(1)
JAVA多线程学习笔记(1) 由于笔者使用markdown格式书写,后续copy到blog可能存在格式不美观的问题,本文的.mk文件已经上传到个人的github,会进行同步更新.github传送门 一 ...
- Java多线程的同步机制(synchronized)
一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的权限,在 java里边就是拿到某个同步对象的锁(一个对象只有一把锁): 如果这个时候同步对象的锁被其他线程拿走了,他(这个 ...
随机推荐
- 阿里云ECS搭建node/mongodb开发环境及部署
一.前端的er在window或mac上安装开发环境应该再清楚不过了.但在服务器上安装还是有点不同的,毕竟是 centOS,从此不得不走上用命令操作…… 二.前期准备 1.首先,我们去阿里云网站阿里云服 ...
- pycharm 用远程环境时报错bash: line 0: cd: /home/tmp: No such file or directory
delete redundant path
- [LUOGU] P3871 [TJOI2010]中位数
题目描述 给定一个由N个元素组成的整数序列,现在有两种操作: 1 add a 在该序列的最后添加一个整数a,组成长度为N + 1的整数序列 2 mid 输出当前序列的中位数 中位数是指将一个序列按照从 ...
- c++_分巧克力(75分)
#include <iostream> using namespace std; int n,k; ],w[]; bool fen(int bian){ ; ;i<n;i++){ c ...
- 如何学好C和C++
酷壳上的两篇文章,转载至此,学好C和C++. 我相信,这可能是很多朋友的问题,我以前也有这样的感觉,编程编到一定的时候,发现能力到了瓶颈,既不深,也不扎实,半吊子.比如:你长期地使用Java和.NET ...
- vue App.vue router 过渡效果, keep-alive 结合使用示例
1, router.js配置 每个路由的index值 2, router.js配置 每个路由的keepAlive值 app.vue 代码 <template> <div id=&qu ...
- InnoDB体系架构总结(一)
缓冲池: 是一块内存区域,通过内存的速度来弥补磁盘速度较慢对数据库性能的影响.在数据库中读取的页数据会存放到缓冲池中,下次再读取相同页的时候,会首先判断该页是否在缓冲池中.对于数据库中页的修改操 ...
- 周三面试Python开发,这几道Python面试题差点答错,Python面试题No7
第1题:阅读下面的代码,默读出A0,A1至An的最终值. A0 = dict(zip(('a','b','c','d','e'),(1,2,3,4,5))) A1 = range(10) A2 = [ ...
- 第二天,学习if,变量,注释
zz_age = 31guss_age=int(input("input your answer:"))if guss_age == zz_age: print ("Yo ...
- Saving James Bond - Hard Version
07-图5 Saving James Bond - Hard Version(30 分) This time let us consider the situation in the movie &q ...