preliminari:MySQL: Operazioni su più fili
Ho un'applicazione che mantiene un pool di thread di circa 100 fili. Ogni thread può durare circa 1-30 secondi prima che una nuova attività lo sostituisca. Quando finisce un thread, quel thread risulterà quasi sempre nell'inserimento di 1-3 record in una tabella, questa tabella viene utilizzata da tutti i thread. Al momento, non esiste alcun supporto transazionale, ma sto cercando di aggiungerlo ora. Inoltre, la tabella in questione è InnoDB. Quindi ...
Goal
Voglio realizzare una transazione per questo. Le regole per l'esecuzione o il rollback di questa transazione risiedono nel thread principale. Fondamentalmente esiste una semplice funzione che restituirà un valore booleano.
- Posso implementare una transazione su più connessioni?
- In caso contrario, più thread possono condividere la stessa connessione? (Nota: ci sono molti inserti in corso qui, e questo è un requisito).
Forse, penso che potrei ripensare a questo semplicemente facendo in modo che il thread aspetti il test del thread principale da completare prima di eseguire il commit. – Zombies
Solo un pensiero, non l'ho verificato: se crei le tue funzioni 'start_transaction()' e 'commit()'/'rollback()' e blocchi un mutex in 'start_transaction()' e lo sblocchi sulla transazione fine, le transazioni saranno molto più sicure da utilizzare nei thread. Non dico che funzionerà come da una connessione diversa. Solo a volte inizi le transazioni in thread e fai affidamento su di esse per essere atomiche. Si noti inoltre che mysql sais che solo una query alla volta dovrebbe essere in esecuzione all'interno di tutti i thread. Ciò include dall'esecuzione della query per completare il recupero del risultato. – NickSoft
La comunicazione sulla connessione deve essere serializzata. Un approccio consiste nell'avere un thread di comunicazione dedicato e fare in modo che altri thread facciano tutto il lavoro necessario, quindi passare i risultati al thread di comunicazione, che serializza le istruzioni. –