在一段更新資料庫的**中,居然出現了虛假的更新動作。
資料庫用的是mysql,測試環境是區域網,4核機器,mysql無事務機制,無儲存過程;php5.2.x。
這段**需要更新超過300條記錄。
每次更新完自己後,需要呼叫jobmanage::synchrojobstatus做同步,同步過程中有一次資料庫操作。
<?php
$ibegin=0;
while (true) limit ,100";
$joblist = db::sql($sql, dbname_company);
if (empty($joblist))
foreach ($joblist as $job)
}$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))else
jobmanage::synchrojobstatus($statusinfo);
} $ibegin+=100;
}?>
更新的語句關鍵是這條:db::edit('tb_job_status', $data, $where, dbname_company);
上面的問題是:
1.查詢資料庫,一輪300多條記錄中,有100多條記錄的該語句沒有生效。
2.這條語句每次都返回了更新成功。
3.資料能夠完整的讀取,沒有遺漏。
經過修改:
<?php
//$ibegin=0;
//while (true) ";// limit ,100";
$joblist = db::sql($sql, dbname_company);
//if (empty($joblist))
foreach ($joblist as $job)
}$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))else
jobmanage::synchrojobstatus($statusinfo);
} //$ibegin+=100;
//}?>
問題不再存在· ·
何種原因,導致這個錯誤出現呢?
初步斷定 limit 出現了這個誤差!
具體如何產生的,還有待分析。
潛在誤差精度誤差
乙個浮不精確到7位小數。浮精確到大約7位有效數字。乙個重要的數字是任意數字,不是乙個佔位符0,包括在小數點左邊的。例如,0095有兩個佔位符零點,所以只有2位數。34.90有4個重要人物。有兩種型別的我們需要警惕的浮點值的誤差 捨入誤差和精度誤差。捨入誤差可以任意長度的數字發生,因為一些數字的二進位...
關於訓練誤差 測試誤差 泛化誤差
我們在學習模式識別的時候,總是會遇到一些專業詞彙,而其中有的專業詞彙叫人傻傻分不清。今天我就來說說訓練誤差 測試誤差 泛化誤差到底是什麼,區別所在。對於分類學習演算法,我們一般將樣本集分為訓練集和測試集,其中訓練集用於演算法模型的學習或訓練,而測試集通常用於評估訓練好的模型對於資料的 效能評估。而這...
MySQL limit查詢優化
mysql的優化是非常重要的。其他最常用也最需要優化的就是limit。mysql的limit給分頁帶來了極大的方便,但資料量一大的時候,limit的效能就急劇下降。同樣是取10條資料 select from yanxue8 visit limit 10000,10 和 select from yan...