问题介绍

最近在给学校做的一个项目中,有一个功能涉及到考核分数问题。

我当时一想,这个问题并不是很难,于是就直接采用了这样的方法:拿着一个表中的数据作为索引,去挨个遍历相关表中的数据,最后经过算分的过程,直接在算分函数中将算出的分数直接写入数据库,这就导致了标题说的问题。

解决过程

这个问题出现的现象是这样的:我从数据库中读取出来的作为索引的数据共有2000多条,使用增强for循环将数据传入算分的方法中。但是后来发现,算出分数的数据总计也就300多条,本以为是这条作为索引的数据在其他表中没有相关的数据造成的分数为0,后来发现,即使是在其他表中有数据的,算出的分数依旧是0。

这个问题着实令人费解,本以为是增强for循环的线程安全问题,后来就将增强for循环改成了迭代器,但是这个问题依旧没有解决。

紧接着,我想了想,开始测试一下这条分数为0的数据是否被读入了函数当中,于是我在算分的函数中设置了个判断条件,结果发现,这条数据真的是没有被读入函数。

无奈之下,只能是一点点debug,我将传入的参数改成了数据表中没有分数的这条数据的,居然发现这条数据能够被成功计算出分数。

这时候我整个人已经是懵逼的了,我不禁在想,为什么会出现这种情况?单独将值传入函数,可以计算出分数值,但所有数据一起读写,就会出现这个问题呢?

此时我已经坐在电脑前debug了一个下午,晚饭也没有吃,本来中午就应该上线的功能,硬是到了晚上依然没有被解决,确实有点慌了。

无奈之下只能是请教之前负责这个项目的学长,但是学长有课,只能等到八点半。在等待期间,我依旧是在疯狂的debug,真的是一点头绪都没有。

学长来了之后,他在循环的过程中加入了一个计算次数的变量,每次输出一下,结果发现,程序并没有执行完成,总是执行到第420次就停了,期间没有任何错误信息,没有任何其他异常,诡异的很。

不过这个时候我们已经意识到了是mysql数据库的问题。

就这样,学长和我们一起一直盯到了两点,之前已经将分数采用一次读取几百条数据的方式成功将分数算出来交给学校科研院处理了。

随着学长一个激动的叫声,问题总算是得到了解决!

最终的解决方案

原来,在我设计的方法中,是读写同时进行的。

虽然第一次将数据读到一个集合中了,但是每次循环都会再次从数据库中读取大量的数据,数据的条数超过了几万条,这还不算,在每次读取后,计算出分数,会将分数直接写入数据库,就这样,在频繁的与数据库进行读写操作的时候,mysql不干了,直接将这个表锁住了。

这也解释了为什么系统的其他的功能可以使用,偏偏和分数相关的功能都不能用的问题。

于是最终将写入分数的步骤单独拿了出来,这样子,成功的将所有数据的分数都算了出来。

持续了超过十个小时的过程中,终于将问题解决了。

经验教训

经过这次惨痛的教训,使我深刻明白了一个问题,下次再设计方法的时候,一定要将读写操作分开进行,否则就会出现十分严重的问题。

虽然整个过程困难无比,但还是收获巨大的,这种感觉真的特别好。

我想以后真的不可能会忘记读写分离这件事情了,哈哈!

谢谢帮忙的学长还有同学!

结语

想了解更多的专业知识、前瞻信息、技术文章吗?那么请我的个人公众号:进击的程序狗,一起进步!

mysql数据库大规模数据读写并行时导致的锁表问题的更多相关文章

  1. 一步一步跟我学习hadoop(7)----hadoop连接mysql数据库运行数据读写数据库操作

        为了方便 MapReduce 直接訪问关系型数据库(Mysql,Oracle).Hadoop提供了DBInputFormat和DBOutputFormat两个类.通过DBInputFormat ...

  2. 使用python将mysql数据库的数据转换为json数据

    由于产品运营部需要采用第三方个推平台,来推送消息.如果手动一个个键入字段和字段值,容易出错,且非常繁琐,需要将mysql的数据转换为json数据,直接复制即可. 本文将涉及到如何使用Python访问M ...

  3. 读取mysql数据库的数据,转为json格式

    # coding=utf-8 ''' Created on 2016-10-26 @author: Jennifer Project:读取mysql数据库的数据,转为json格式 ''' import ...

  4. mysql数据库主从同步读写分离(一)主从同步

    1.mysql数据库主从同步读写分离 1.1.主要解决的生产问题 1.2.原理 a.为什么需要读写分离? 一台服务器满足不了访问需要.数据的访问基本都是2-8原则. b.怎么做?  不往从服务器去写了 ...

  5. CentOS6 更改Mysql数据库的数据存放位置

    mysql使用yum安装时,默认的数据是存储在/var/lib/mysql下.一般情况下,为了数据的安全性,建议将mysql数据库的数据文件存储在系统的第二块磁盘上的目录下可以按照以下步骤进行操作: ...

  6. mysql数据库delete数据时不支持表别名

    今天在帮同事查看一条删除的SQL语句执行出错的问题 SQL语句如下: 1 DELETE FROM LEAD_SYSTEM_MENU_ORG_REF as t WHERE t.resourceid='4 ...

  7. 转】mysql数据库delete数据时不支持表别名

    原博文出自于: http://www.cnblogs.com/xdp-gacl/p/4012853.html 感谢! 今天在帮同事查看一条删除的SQL语句执行出错的问题 SQL语句如下: 1 DELE ...

  8. 在mysql数据库中创建oracle scott用户的四个表及插入初始化数据

    在mysql数据库中创建oracle scott用户的四个表及插入初始化数据 /* 功能:创建 scott 数据库中的 dept 表 */ create table dept( deptno int ...

  9. Loadrunner脚本优化-参数化之关联MySQL数据库获取数据

    脚本优化-参数化之关联MySQL数据库获取数据 by:授客 QQ:1033553122 测试环境: Loadrunner 11 Win7 64位 实操: 1.   安装MySQL ODBC驱动程序 O ...

随机推荐

  1. ArcoLinux安装完成后的的配置

    ArcoLinux安装完成后的的配置 这可能是全网第一篇Arcolinux的教程 1. 更改源 修改/etc/pacman.d/mirrorlist 在最头上增加清华源 Server = https: ...

  2. Rails 第一课:环境配置 Ruby Rails RVM Heroku

    安装 上传专案到 Heroku 安装 Ruby 2.3.1 Rails 5.0.0.1 RVM 1.27.0 比较幸运一个问题都未碰到 MacOS 10.12.1 配置完成系统顺利升级到10.12.2 ...

  3. 指令——cat

    作用1:cat有直接打开一个文件的功能,只看不用编辑. 语法:#cat 文件的路径 选项:-n, --number 对输出的所有行编号. 如:用cat查看/etc/passwd [root@local ...

  4. 指令——cp

    一个完整的指令的标准格式: Linux通用的格式——#指令主体(空格) [选项](空格) [操作对象] 一个指令可以包含多个选项,操作对象也可以是多个. 指令:cp (copy,复制) 作用:复制文件 ...

  5. python 定义一个空集合、空字典

    s = set() #定义一个空集合 s = {} #定义一个空字典

  6. react的this.setState详细介绍

    this.setState是react类组件中最常用的一个react API,使用它可以改变state从而改变页面.今天我们就来详细的学习一下这个东西.比如: import React, { Comp ...

  7. spring 动态bean注册

    1. import org.springframework.beans.MutablePropertyValues; import org.springframework.beans.factory. ...

  8. python 列表和字符串

    python 列表中保留所有字符串前三项,并保存到一个新的列表l = [s[:3] for s in data] python 在列表中查找包含所以某个字符串的项,并保存到一个新的列表l = [s f ...

  9. 超低功耗Sub-1GHz性价比首选方案:CMT2300

    关于超低功耗Sub-1GHz射频收发器,目前性价比方面CMT2300是一款大多客户的首选方案,不管是成本方面还是性能方面,都能大大的满足客户的需求.下面为大家讲解下CMT2300 这款Sub-1GHz ...

  10. php mysql 由于目标计算机积极拒绝,无法连接 错误原因

    除了在网上百度的那些外,我的机器发生了这个错误 我需要用php远程连接mysql,在目标机上已经给了客户机权限,可是还是发生“ 由于目标计算机积极拒绝,无法连接”错误 在客户机上直接用终端连接目标机的 ...