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

Gestione delle transazioni in ambiente multithread

Suggerirei di accodare tutte le azioni SQL da più thread in una struttura di dati intermedia e quindi inserirle nel database da un singolo thread. È possibile avere le strutture intermedie thread-safe come ConcurrentHashMap , ConcurrentLinkedQueue oppure puoi semplicemente sincronizzare quando lavori con esso.

In questo modo non è nemmeno necessario avviare la transazione in anticipo. I dati in sospeso potrebbero essere meno sicuri, ma presumo che non siano molto più sicuri nel database mentre la transazione non è ancora stata salvata.

Ovviamente, questo può funzionare solo se non hai select estratti conto che prelevano dati di transazione non vincolati dalla stessa transazione. L'eliminazione di tali query in un modo o nell'altro potrebbe richiedere una riprogettazione.

Usa CountDownLatch per rilevare quando tutti i dati sono pronti e il thread di scrittura del database dovrebbe iniziare la sua azione. Se non accade mai, usa il pattern del reattore per il thread di scrittura del database.