mysql数据库大规模数据读写并行时导致的锁表问题
问题介绍
最近在给学校做的一个项目中,有一个功能涉及到考核分数问题。
我当时一想,这个问题并不是很难,于是就直接采用了这样的方法:拿着一个表中的数据作为索引,去挨个遍历相关表中的数据,最后经过算分的过程,直接在算分函数中将算出的分数直接写入数据库,这就导致了标题说的问题。
解决过程
这个问题出现的现象是这样的:我从数据库中读取出来的作为索引的数据共有2000多条,使用增强for循环将数据传入算分的方法中。但是后来发现,算出分数的数据总计也就300多条,本以为是这条作为索引的数据在其他表中没有相关的数据造成的分数为0,后来发现,即使是在其他表中有数据的,算出的分数依旧是0。
这个问题着实令人费解,本以为是增强for循环的线程安全问题,后来就将增强for循环改成了迭代器,但是这个问题依旧没有解决。
紧接着,我想了想,开始测试一下这条分数为0的数据是否被读入了函数当中,于是我在算分的函数中设置了个判断条件,结果发现,这条数据真的是没有被读入函数。
无奈之下,只能是一点点debug,我将传入的参数改成了数据表中没有分数的这条数据的,居然发现这条数据能够被成功计算出分数。
这时候我整个人已经是懵逼的了,我不禁在想,为什么会出现这种情况?单独将值传入函数,可以计算出分数值,但所有数据一起读写,就会出现这个问题呢?
此时我已经坐在电脑前debug了一个下午,晚饭也没有吃,本来中午就应该上线的功能,硬是到了晚上依然没有被解决,确实有点慌了。
无奈之下只能是请教之前负责这个项目的学长,但是学长有课,只能等到八点半。在等待期间,我依旧是在疯狂的debug,真的是一点头绪都没有。
学长来了之后,他在循环的过程中加入了一个计算次数的变量,每次输出一下,结果发现,程序并没有执行完成,总是执行到第420次就停了,期间没有任何错误信息,没有任何其他异常,诡异的很。
不过这个时候我们已经意识到了是mysql数据库的问题。
就这样,学长和我们一起一直盯到了两点,之前已经将分数采用一次读取几百条数据的方式成功将分数算出来交给学校科研院处理了。
随着学长一个激动的叫声,问题总算是得到了解决!
最终的解决方案
原来,在我设计的方法中,是读写同时进行的。
虽然第一次将数据读到一个集合中了,但是每次循环都会再次从数据库中读取大量的数据,数据的条数超过了几万条,这还不算,在每次读取后,计算出分数,会将分数直接写入数据库,就这样,在频繁的与数据库进行读写操作的时候,mysql不干了,直接将这个表锁住了。
这也解释了为什么系统的其他的功能可以使用,偏偏和分数相关的功能都不能用的问题。
于是最终将写入分数的步骤单独拿了出来,这样子,成功的将所有数据的分数都算了出来。
持续了超过十个小时的过程中,终于将问题解决了。
经验教训
经过这次惨痛的教训,使我深刻明白了一个问题,下次再设计方法的时候,一定要将读写操作分开进行,否则就会出现十分严重的问题。
虽然整个过程困难无比,但还是收获巨大的,这种感觉真的特别好。
我想以后真的不可能会忘记读写分离这件事情了,哈哈!
谢谢帮忙的学长还有同学!
结语
想了解更多的专业知识、前瞻信息、技术文章吗?那么请我的个人公众号:进击的程序狗,一起进步!
mysql数据库大规模数据读写并行时导致的锁表问题的更多相关文章
- 一步一步跟我学习hadoop(7)----hadoop连接mysql数据库运行数据读写数据库操作
为了方便 MapReduce 直接訪问关系型数据库(Mysql,Oracle).Hadoop提供了DBInputFormat和DBOutputFormat两个类.通过DBInputFormat ...
- 使用python将mysql数据库的数据转换为json数据
由于产品运营部需要采用第三方个推平台,来推送消息.如果手动一个个键入字段和字段值,容易出错,且非常繁琐,需要将mysql的数据转换为json数据,直接复制即可. 本文将涉及到如何使用Python访问M ...
- 读取mysql数据库的数据,转为json格式
# coding=utf-8 ''' Created on 2016-10-26 @author: Jennifer Project:读取mysql数据库的数据,转为json格式 ''' import ...
- mysql数据库主从同步读写分离(一)主从同步
1.mysql数据库主从同步读写分离 1.1.主要解决的生产问题 1.2.原理 a.为什么需要读写分离? 一台服务器满足不了访问需要.数据的访问基本都是2-8原则. b.怎么做? 不往从服务器去写了 ...
- CentOS6 更改Mysql数据库的数据存放位置
mysql使用yum安装时,默认的数据是存储在/var/lib/mysql下.一般情况下,为了数据的安全性,建议将mysql数据库的数据文件存储在系统的第二块磁盘上的目录下可以按照以下步骤进行操作: ...
- mysql数据库delete数据时不支持表别名
今天在帮同事查看一条删除的SQL语句执行出错的问题 SQL语句如下: 1 DELETE FROM LEAD_SYSTEM_MENU_ORG_REF as t WHERE t.resourceid='4 ...
- 转】mysql数据库delete数据时不支持表别名
原博文出自于: http://www.cnblogs.com/xdp-gacl/p/4012853.html 感谢! 今天在帮同事查看一条删除的SQL语句执行出错的问题 SQL语句如下: 1 DELE ...
- 在mysql数据库中创建oracle scott用户的四个表及插入初始化数据
在mysql数据库中创建oracle scott用户的四个表及插入初始化数据 /* 功能:创建 scott 数据库中的 dept 表 */ create table dept( deptno int ...
- Loadrunner脚本优化-参数化之关联MySQL数据库获取数据
脚本优化-参数化之关联MySQL数据库获取数据 by:授客 QQ:1033553122 测试环境: Loadrunner 11 Win7 64位 实操: 1. 安装MySQL ODBC驱动程序 O ...
随机推荐
- Centos7搭建SVN服务
1.安装 subversion [root@CentOS var]# yum -y install subversion 2.创建 svn 版本库,初始化相关配置文件 [root@CentOS v ...
- 九九乘法表的四种三角形排布方式(for循环以及while循环的互换)
#region //右上 for (int i = 1; i <= 9; i++){ for (int j = 1; j <= 9; j++){ if (i > j){ Consol ...
- 验证试验 更改了从机CAN通信的MAC地址 从机新挂CAN网络 上电自检通过
更改前 该之后 主机程序 与 从机 程序 已经上传到网盘上 ,主机和从机程序基本一致, 唯一的区别是 从机更好了MAC地址 为0X10 主机的固定MAC地址为 0X1F 改程序的配置上设置的是双滤波 ...
- FreeCAD stp文件基于python脚本操作
FreeCAD对于3D模型处理这块的东西封装的还是很完善的,所以移植这块的东西还是有必要的! 首先下载FreeCAD编译好的库: https://www.freecadweb.org/wiki/Dow ...
- Java8 Stream分组
//根据排课id分组 Map<Integer, List<Schedule4Homework>> idSchedule4HomeworksMap = schedule4Home ...
- centos7上安装mysql8
话不多说仍然是更换虚拟机的系列安装. 一.首先下载最先版的mysql.到官网下载https://dev.mysql.com/downloads/file/?id=477146 下载后上传linux到相 ...
- CSS - 美化字体 => CSS的-font-smoothin属性优化
body{ margin: 0; font-family: Arial, Helvetica, sans-serif; line-height: 1.2em; back ...
- 12.Python的高级语法和用法
# from enum import Enum # 枚举 # class VIP(Enum): # YELLOW = # YELLOW_ALIAS = # 别名 # GREEN = # BLACK = ...
- ES6 之 对象属性的可枚举性和遍历
1.Object.getOwnPropertyDescriptor() 解释:获取对对象属性的描述对象. let obj = { foo: 123 }; console.log(Object.getO ...
- Bootstrap 侧边栏 导航栏
http://blog.csdn.net/shangmingchao/article/details/49763351 实测效果图: