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里边就是拿到某个同步对象的锁(一个对象只有一把锁): 如果这个时候同步对象的锁被其他线程拿走了,他(这个 ...
随机推荐
- js 数组过滤 filter
let res = this.list.filter(item => routeEqual(this.currentRouteObj, item) || item.name === this.$ ...
- FormItem label 属性 可以改成 slot模式 就能加入br回车了 iview
FormItem label 属性 可以改成 slot模式 就能加入br回车了 iview <FormItem> <div slot='label'>测试文字<br> ...
- iview table的render()函数基本的用法
render:(h,params) => { return h(" 定义的元素 ",{ 元素的性质 }," 元素的内容"/[元素的内容]) }
- Linux下scp报Permission denied错误的解决方法
sudo vim /etc/ssh/sshd_config 把PermitRootLogin no改成PermitRootLogin yes如果原来没有这行或被注释掉,就直接加上PermitRootL ...
- node程序的部署神器pm2的基本使用
pm2是从nodejs衍生出来的服务器进程管理工具,可以做到开机就启动nodejs.当然了,也可以用nohup来做这件事情的. 前言 众所周知,Node.js运行在Chrome的JavaScript运 ...
- react-native 在新版Xcode(10+)中运行出现的问题: node_modules/react-native/third-party/glog-0.3.4 , C compiler cannot create executables
报错发生在 react-native : 0.55.4 (或存在于更低的版本) 报错: ----/node_modules/react-native/third-party/glog-0.3.4': ...
- Openjudge-百练-4013-踩方格
这题目是一道深搜的题目,我们写一个递归函数叫Ways(int i, int j ,int n),i j就是当前所处的坐标,我们设置一个visited数组,简称 V . 对于这个数组,首先初始化为零,然 ...
- nginx代理yum
适用场景:有多台服务器,但是只有1台服务器可以出公网,此时即可使用如下方式,进行yum代理,解决内网服务器不能yum的尴尬. 一.首先需要把/etc/yum.repos.d下的文件备份到bak,然后留 ...
- Java方法传递参数传值还是传址的问题
这几天重构项目代码遇到一个疑问:可不可以在方法A中定义一个boolean变量b为false,然后A调用方法C把b传递到C方法中经过一些列业务判断后修改为true,C执行结束后A方法中b的值还是原来的f ...
- 如何用纯 CSS 创作一个 3D 文字跑马灯特效
效果预览 在线演示 按下右侧的"点击预览"按钮在当前页面预览,点击链接全屏预览. https://codepen.io/zhang-ou/pen/GdrrZq 可交互视频教程 此视 ...