2016-03-21 75 views
0

問題是,mysql在我們的服務器上的CPU上運行得很高,持續了大約15分鐘。在那段時間,一些到服務器的數據沒有被插入到數據庫中,而是提交了事務。插入新記錄時,MySQL跳過了一行

重啓後mysql問題解決了。

所以這意味着即使提交的事務在表中沒有新行。這方面的證據是,應該看起來像這樣自動遞增的主鍵:

100 
101 
102 

但目前是這樣的:

100 
102 

所以記錄101人失蹤,其跳過。

現在我需要找到該記錄的某種日誌,如果存在。

我試過mysqldump log,但那裏沒有記錄。記錄101仍然丟失。

我需要找到一種方法重新創建該事務並重新執行。

有沒有人有類似的問題?

代碼基本上是這樣的:

$db->autocommit(FALSE); 

$sql = "INSERT INTO t (amount, datetime) VALUES ($amount, '$datetime')"; 
$db->query($sql); 

$id = $db->insert_id; 
$sql = "INSERT INTO tr (id, log) VALUES ($id, '$log')"; 
$db->query($sql); 

$db->autocommit(TRUE); 

回答

1

序列已經增加後的交易最有可能中止。從數據庫的角度來看,這不是一個問題:自動遞增的列不需要在其中依次存在所有的ID。從代碼/用戶角度來看,這應該也不成問題。如果你的代碼需要連續的ID(爲了審計的目的,可以說),你必須自己實現一個系統。如果你不需要,那麼再次運行交易。這將創建ID 103(在你的情況)。

+0

基本上問題是客戶端從服務器得到響應,一切正常,他得到了他的票。但是該票不在服務器上,並且不存在。所以我不需要順序標識,我只是說,跳過的標識是mysql在插入時跳過一行並且沒有拋出任何異常的證據。 – madeye

+0

聽起來你的代碼沒有檢查事務狀態:你能添加執行這個事務的代碼嗎? –

+0

我用代碼更新了我的問題,但我不知道這是否有助於它的非常基本的東西 – madeye