我有一個mySQL更新查詢,有時會更新所有的字段,有時它會更新除一個之外的所有字段。更新查詢有時不會更新mySQL數據庫中的字段
約10%的通話失敗。
我的表是:
CREATE TABLE IF NOT EXISTS `grades` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`state` int(1) NOT NULL,
`result` varchar(255) NOT NULL,
`date_synced` datetime NOT NULL,
`updated_at` datetime NOT NULL,
PRIMARY KEY (`id`))
ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=4395 ;
我的查詢是:
$sqlstr = "UPDATE grades SET result = '$result', state = 2, date_synced = '$date', updated_at = '$date' WHERE id = $id";
如果失敗的話,結果,date_synced和的updated_at被更新,但狀態保持不變。
還有一個查詢只更新狀態字段,而且一個查詢也間歇性地失敗。
我一直無法在我們的測試環境中重新創建問題。生產mySQL數據庫或某種鎖定衝突可能有問題嗎?
我有更多信息。我正在使用mysqli。另一個只更新狀態的查詢就是使用mysql。會導致問題嗎?
我以爲InnoDB是按行鎖定的。它不允許部分行更新,是嗎?
解決評論的另一個更新。
我的代碼流非常線性。
The row is created with state=0.
<flash stuff here> and the row is updated with state=1
A cron job pulls all state=1 and sends an api call
if api call is successful, the row is updated with state=2, result, date_synced, and updated_at
if api call is error, the row is updated with state=3, result, and updated_at
狀態字段永遠不會設置爲0(在閃存之後)或1(在api調用之後)。由於日期_synced和結果正在設置,但(有時)狀態仍然爲1,這就像狀態字段的更新正在被丟棄。
我會添加更新觸發器,看看是否給了我更多的信息。
您應該添加一個更新觸發器和一個記錄表,存儲舊值和新值以及id,會話ID和當前用戶以進行調試。也許這些變化已經通過,但被另一個聲明覆蓋 –
我認爲Rufo先生的評論可能對你的情況有很大幫助,因爲它有助於確定事情發生的順序,以及是否是一個更復雜的情況,其中多個查詢結果在你看到的圖片中。 – DWright
「[..]或某種鎖定衝突[..]」,因爲同一行內的其他字段已更新,因此您沒有鎖定問題。 innodb可以鎖定的最小的東西是一排。我無法鎖定單個字段。 – scones