Stai usando MongoDB per memorizzare l'ID. È uno stato. La generazione dell'ID è una funzione. Si utilizza Mongodb per generare l'ID quando il processo mongodb prende gli argomenti della funzione e restituisce l'ID generato. Non è quello che stai facendo. Stai usando nodejs per generare l'ID.
Il numero di thread, o meglio i loop di eventi, è fondamentale in quanto definisce l'architettura ma in entrambi i casi non sono necessarie transazioni. Le transazioni in mongodb vengono chiamate "transazioni multi-documento" esattamente per evidenziare che sono destinate all'aggiornamento coerente di più documenti contemporaneamente. Il primo paragrafo di https://docs.mongodb.com/manual/core/transactions / ti avverte che se aggiorni un singolo documento non c'è spazio per le transazioni.
Una singola applicazione a thread non richiede alcuna sincronizzazione. Puoi leggere in modo affidabile l'ultimo ID generato all'avvio e garantire che l'ID sia univoco all'interno del processo nodejs. Se escludi mongodb e altri I/O dalla funzione di generazione, lo renderai sincrono in modo da poter mantenere lo stato dell'ID all'interno del processo nodejs e garantirne l'unicità. Una volta generato, puoi persistere nel db in modo asincrono. Nella peggiore delle ipotesi potresti avere un divario nei numeri sequenziali ma nessun duplicato.
Se c'è la minima possibilità che potresti dover scalare fino a più di 1 processo nodejs per gestire più richieste simultanee o aggiungere un altro host per la ridondanza in futuro, dovrai sincronizzare la generazione dell'ID e puoi utilizzare gli indici univoci Mongodb per Quello. La funzione stessa non cambia molto, si genera comunque l'ID come in un'architettura a thread singolo ma si aggiunge un passaggio aggiuntivo per salvare l'ID in mongo. Il documento dovrebbe avere un indice univoco nel campo ID, quindi in caso di aggiornamenti simultanei una delle query aggiungerà correttamente il documento e un'altra fallirà con "E11000 errore chiave duplicata". Catturi tali errori sul lato nodejs e ripeti di nuovo la funzione selezionando il numero successivo: