Ho bisogno di un piccolo aiuto con SELECT FOR UPDATE
(resp. LOCK IN SHARE MODE
).SELECT ... FOR UPDATE da una tabella in più thread
Ho una tabella con circa 400 000 record e ho bisogno di eseguire due diverse funzioni di elaborazione su ogni riga.
La struttura della tabella è appropriatamente questo:
data (
`id`,
`mtime`, -- When was data1 set last
`data1`,
`data2` DEFAULT NULL,
`priority1`,
`priority2`,
PRIMARY KEY `id`,
INDEX (`mtime`),
FOREIGN KEY ON `data2`
)
Le funzioni sono un po 'diverso:
- prima funzione - ha per l'esecuzione in loop su tutti i record (è abbastanza veloce), dovrebbe selezionare i record basati su
priority1
; impostadata1
emtime
- seconda funzione - deve essere eseguito solo una volta su ogni record (è piuttosto lento), dovrebbe selezionare i record in base a
priority2
; impostadata1
emtime
Non dovrebbero modificare la stessa riga, allo stesso tempo, ma il ristretto, può restituire una riga in entrambi (priority1
e priority2
hanno valori diversi) e va bene per la transazione di aspettare se questo è il caso (e mi aspetterei che questo sarebbe l'unico caso in cui bloccherà).
sto selezionando i dati basati su query seguenti:
-- For the first function - not processed first, then the oldest,
-- the same age goes based on priority
SELECT id FROM data ORDER BY mtime IS NULL DESC, mtime, priority1 LIMIT 250 FOR UPDATE;
-- For the second function - only processed not processed order by priority
SELECT if FROM data ORDER BY priority2 WHERE data2 IS NULL LIMIT 50 FOR UPDATE;
Ma quello che sto vivendo è che ogni volta una sola query restituisce al momento.
Quindi le mie domande sono:
- È possibile acquisire due serrature separate in due operazioni distinte sul mazzo separata di righe (nella stessa tabella)?
- Ho molte collisioni tra la prima e la seconda query (ho problemi nel debugging, qualsiasi suggerimento su come eseguire il debug di
SELECT ... FROM (SELECT ...) WHERE ... IN (SELECT)
sarebbe apprezzato)? - Can
ORDER BY ... LIMIT ...
può causare problemi? - Gli indici e le chiavi possono causare problemi?
cosa è il tipo di tabella? MyISAM o InnoDB? Per quanto ne so, solo InnoDB ha il blocco a livello di riga. MyISAM ha solo un blocco a livello di tabella. –
Vedo ... Hai qualche indice sul tuo tavolo? –
@ Mt.Schneiders Sì, sì. Li ho aggiunti allo schema. Grazie per averlo notato. – Vyktor