Verifica della concorrenza con l'ultima modifica

0

Ho un'app con le seguenti tre tabelle

  1. Email (numero email, indirizzo)
  2. Destinatari (reportNumber, emailNumber, lastChangeTime, stato)
  3. Segnala (reportNumber, reportName)

Ho un'applicazione C# che utilizza query in linea per la selezione dei dati.

Ho una query di selezione che seleziona tutti i report e i relativi destinatari. I destinatari sono selezionati come stringa separata da virgola.

Durante l'aggiornamento, devo controllare concurrency . Attualmente sto usando MAX (lastChangeTime) per ogni reportNumber. Questo è selezionato come maxTime. Prima dell'aggiornamento, controlla che

lastChangeTime <= maxTime. --//It works fine

Uno dei miei co-sviluppatori mi ha chiesto perché non usare GETDATE() come "maxTime" piuttosto che usare un'operazione MAX . Anche questo funziona. Ecco cosa stiamo verificando se i record non vengono aggiornati dopo record selection time .

C'è qualche rischio nell'usare GETDATE() per questo scopo?

    
posta Lijo 02.12.2012 - 10:49
fonte

1 risposta

1

Se ottieni i dati all'inizio del tuo processo, è una buona soluzione. Questo è particolarmente vero se hai a che fare con più tavoli in quanto devi solo tracciare un timestamp. Se stai monitorando più timestamp, è possibile utilizzare il timestamp sbagliato in un confronto.

L'unica mancanza, che si applica in entrambi i casi, è se i record sono inseriti al timestamp ma non sono inclusi nel set di risultati. (È possibile che il valore MAX restituisca lo stesso valore di GetDate.) Anche la transazione di inserimento a esecuzione prolungata può rappresentare un problema se il timestamp e l'intervallo di commit variano in modo significativo.

L'altro problema è la sincronizzazione dell'orologio tra il server del database (che dovrebbe impostare il timestamp in un trigger) e l'host su cui si esegue il download di GetDate. È consigliabile l'uso di NTP per sincronizzare gli orologi. Ho visto casi in cui i nuovi utenti non potevano accedere per un paio di minuti a causa di orologi non sincronizzati. Potrebbe essere più sicuro ottenere la data dal database in una singola chiamata.

    
risposta data 02.12.2012 - 16:25
fonte

Leggi altre domande sui tag