在一段更新数据库的代码中,居然出现了虚假的更新动作。
数据库用的是MySql,测试环境是局域网,4核机器,Mysql无事务机制,无存储过程;PHP5.2.x。
这段代码需要更新超过300条记录。
每次更新完自己后,需要调用JobManage::synchroJobStatus做同步,同步过程中有一次数据库操作。
<?php
$ibegin=0;
while (true) {
$sql = "SELECT JI_ID FROM tb_job_info WHERE JI_CompanyID={$companyID} LIMIT {$ibegin},100";
$jobList = DB::sql($sql, DBName_company);
if (empty($jobList)) {
break;
}
foreach ($jobList as $job){
$data = array(
'JS_IsAdminChecked' => $status,
'JS_AdminCheckedRemark' => $remark,
'JS_AdminCheckedTime' => time(),
);
$where = array('JS_JobID' => $job["JI_ID"]);
$statusInfo = DB::getRow('tb_job_status', $where, DBName_company,'JS_JobID');
if(empty($statusInfo)){
$iRnt = $this->addJobStatus($job['JI_ID'],$status,$remark);
if($iRnt<0){
return 0;
}
}
$iRtn += DB::edit('tb_job_status', $data, $where, DBName_company);
$statusInfo = array_merge($statusInfo,$data);
$data = array(
'LC_Type' => $isAdminCheck,
'LC_AdminID'=>$checkAdminID,
'LC_CheckStatus' => $status,
'LC_HitWords' => $remark,
'LC_UpdateTime' => time()
);
$where = array('LC_CompanyID' => $companyID,'LC_JobID' =>$job["JI_ID"]);
$exist = DB::getRow('tb_log_checkjob',$where,DBName_company,'LC_CompanyID');
if(!empty($exist)){
DB::edit('tb_log_checkjob',$data,$where,DBName_company);
}else{
$data = array_merge($data,$where,array('LC_AddTime' => time()));
$result = DB::add('tb_log_checkjob',$data,DBName_company);
}
JobManage::synchroJobStatus($statusInfo);
}
$ibegin+=100;
}
?>
更新的语句关键是这条:DB::edit('tb_job_status', $data, $where, DBName_company);
上面的问题是:
1.查询数据库,一轮300多条记录中,有100多条记录的该语句没有生效。
2.这条语句每次都返回了更新成功。
3.数据能够完整的读取,没有遗漏。
经过修改:
<?php
//$ibegin=0;
//while (true) {
$sql = "SELECT JI_ID FROM tb_job_info WHERE JI_CompanyID={$companyID}";// LIMIT {$ibegin},100";
$jobList = DB::sql($sql, DBName_company);
//if (empty($jobList)) {
// break;
//}
foreach ($jobList as $job){
$data = array(
'JS_IsAdminChecked' => $status,
'JS_AdminCheckedRemark' => $remark,
'JS_AdminCheckedTime' => time(),
);
$where = array('JS_JobID' => $job["JI_ID"]);
$statusInfo = DB::getRow('tb_job_status', $where, DBName_company,'JS_JobID');
if(empty($statusInfo)){
$iRnt = $this->addJobStatus($job['JI_ID'],$status,$remark);
if($iRnt<0){
return 0;
}
}
$iRtn += DB::edit('tb_job_status', $data, $where, DBName_company);
$statusInfo = array_merge($statusInfo,$data);
$data = array(
'LC_Type' => $isAdminCheck,
'LC_AdminID'=>$checkAdminID,
'LC_CheckStatus' => $status,
'LC_HitWords' => $remark,
'LC_UpdateTime' => time()
);
$where = array('LC_CompanyID' => $companyID,'LC_JobID' =>$job["JI_ID"]);
$exist = DB::getRow('tb_log_checkjob',$where,DBName_company,'LC_CompanyID');
if(!empty($exist)){
DB::edit('tb_log_checkjob',$data,$where,DBName_company);
}else{
$data = array_merge($data,$where,array('LC_AddTime' => time()));
$result = DB::add('tb_log_checkjob',$data,DBName_company);
}
JobManage::synchroJobStatus($statusInfo);
}
//$ibegin+=100;
//}
?>
问题不再存在· ·
何种原因,导致这个错误出现呢?
初步断定 Limit 出现了这个误差!
具体如何产生的,还有待分析。
分享到:
相关推荐
如何向mysql中插入数据?
为什么不建议给MySQL设置Null值?《死磕MySQL系列 十八》.doc
分别写出启动、连接、停止和卸载MySql服务(服务名为MySql)的语句?
Mysql的分页的两个参数 select * from user limit 1,2 ... 您可能感兴趣的文章:详解MySQL的limit用法和分页查询语句的性能分析MYSQL分页limit速度太慢的优化方法mysql limit分页优化方法分享Mysql limit
mysql limit两个参数
mysql limit分页优化 同样是取10条数据 select * from yanxue8_visit limit 10000,10 和 select * from yanxue8_visit limit 0,10 就不是一个数量级别的。 网上也很多关于limit的五条优化准则,都是翻译自MySQL...
MySQL C++ Driver Based on JDBC 4.0 Specification ?Installing MySQL Connector/C++ ?Runtime Dependencies ?IDE for Developing C++ Applications ?Create the City Table in the test Database for Code ...
SQL数据库不支持limit语法,利用逻辑处理函数模拟出来的思路,具体可照此改造。
关于Mysql分页的两种方法,一种假分页,没有效率提高,另一种使用limit,对数据量小的情况下效率会高点
随着去 IOE 运动的如火如荼,MySQL 数据库已经深入 到传统行业,大有改变行业格局。而与此同时,MySQL 数据库规模成倍的增长, 如何快速定位问题,解决问题?如何规模化、自动化运维?如何进行优化,提高 MySQL ...
MySQL之Limit简单优化.md 同样是取90000条后100条记录,传统方式还是改造方式? 传统方式是先取了前90001条记录,取其中最大一个ID值作为起始标识,然后利用它可以快速定位下100条记录 改造方式是仅仅取90000条记录后
本文档针对mysql分页之limit慢的问题,使用联合索引在大数据量的情况下优化limit分页的性能
Limit语法: 复制代码 代码如下:SELECT * FROM table LIMIT [offset,] rows | rows OFFSET ...为了与 PostgreSQL 兼容,MySQL 也支持句法:LIMIT # OFFSET #。 eg: 复制代码 代码如下:mysql> SELECT * FROM table L
mysql limit两个参数的四种用法:mysql数据库中limit子句可以被用于强制select语句返回指定的记录数。limit接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的...
详细介绍了mysql的limit经典用法及优化实例,有需要的朋友可以参考一下
这个文件主要讲述了mysql中limit的原理,并举例子进行了使用说明。
springboot2.1.3 + mysql(mybatis) + mongodb maven项目