Ho una query di aggiornamento mySQL che a volte aggiornerà tutti i campi e talvolta aggiornerà tutti i campi tranne uno.a volte non aggiorna il campo nel database mySQL
Non funziona su circa il 10% delle chiamate.
Il mio tavolo è:
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 ;
La mia domanda è:
$sqlstr = "UPDATE grades SET result = '$result', state = 2, date_synced = '$date', updated_at = '$date' WHERE id = $id";
Quando non riesce, di conseguenza, date_synced, e updated_at vengono aggiornati, ma lo stato rimane invariato.
C'è un'altra query che aggiorna solo il campo di stato e quello anche in modo intermittente non riesce.
Non sono stato in grado di ricreare il problema nel nostro ambiente di test. Potrebbe esserci qualcosa di sbagliato nel database mySQL di produzione o in qualche tipo di collisione bloccante?
Ho ulteriori informazioni. Sto usando mysqli. L'altra query che aggiorna solo lo stato sta usando mysql. Ciò causerebbe un problema?
Pensavo che InnoDB fosse bloccato per riga. Non consente gli aggiornamenti di riga parziale, vero?
Un altro aggiornamento per indirizzare i commenti.
Il mio flusso di codice è piuttosto lineare.
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
Il campo è stato mai messo di nuovo a 0 (dopo il flash) o 1 (dopo la chiamata API). Poiché la data _sincronizzato e il risultato sono stati impostati ma (a volte) lo stato è ancora 1, è come se l'aggiornamento al campo dello stato venisse eliminato.
Aggiungo il trigger di aggiornamento e vedo se questo mi dà più informazioni.
è necessario aggiungere un trigger di aggiornamento e una tabella di registro che memorizzi i vecchi e nuovi valori insieme a id, id di sessione e utente corrente per il debug. forse le modifiche passano ma sono state sovrascritte da un'altra affermazione –
Penso che il commento di Sir Rufo potrebbe essere super-utile per la tua situazione, perché aiuterà a definire la sequenza in cui accadono le cose e se si tratta di uno scenario più complesso in cui compaiono più query nella foto che stai vedendo. – DWright
"[..] o una sorta di collisione di blocco [..]" poiché altri campi della stessa riga sono stati aggiornati, non si verificano problemi di blocco. la cosa più piccola che innodb può bloccare è una riga. non riesco a bloccare un singolo campo – scones