Mysql
 sql >> Database >  >> RDS >> Mysql

come bloccare alcune righe poiché non vengono selezionate in un'altra transazione

Sembra che tu abbia bisogno di una qualche forma di indicatore per identificare le righe come "in uso" in modo che le altre istanze non elaborino gli stessi dati; se utilizzi un tipo booleano o data è irrilevante, in qualche modo devi contrassegnare le righe in uso.

Puoi farlo tramite un dispatcher, un processo o un thread con accesso esclusivo alla tua tabella e il cui unico compito è selezionare le righe e passarle ad altri processi su cui lavorare. Anche in questo caso il mittente dovrà sapere fino a che punto ha ottenuto i dati in modo da tornare allo stesso problema.

Un altro modo è usare un campo per indicare che la riga è in uso (come hai detto nella tua domanda). Ogni processo aggiorna un blocco di righe con un ID univoco, eseguito all'interno di una transazione per bloccare la tabella; Userei il numero di connessione restituito da CONNECTION_ID() per contrassegnarli, allora sai che è unico.

Dopo UPDATE ... WHERE connection_id IS NULL (con un limite applicato) la transazione è completa, il processo può SELECT ... WHERE connection_id = CONNECTION_ID() per ottenere le loro righe per l'elaborazione.

Quando hanno terminato il loro lavoro, tutto il ciclo ricomincia per segnare la serie di righe successiva fino a quando non sono state lavorate tutte.