Mysql Limit 出現誤差?

2021-08-30 06:51:50 字數 2079 閱讀 5267

在一段更新資料庫的**中,居然出現了虛假的更新動作。

資料庫用的是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...