Qual è il modo comune per gestire gli aggiornamenti simultanei in un database SQL?Come gestire gli aggiornamenti simultanei nei database?
consideri uno schema SQL semplice (i vincoli e le impostazioni predefinite non mostrati ..) come
create table credits (
int id,
int creds,
int user_id
);
L'intento è quello di conservare un qualche tipo di crediti per un utente, ad esempio, qualcosa come la reputazione di StackOverflow.
Come gestire gli aggiornamenti simultanei a quella tabella? Alcune mangiare:
update credits set creds= 150 where userid = 1;
In questo caso l'applicazione retreived il valore corrente, calcolato il nuovo valore (150) ed eseguito un aggiornamento. Che incantesimi se qualcun altro fa lo stesso allo stesso tempo. Suppongo di aver completato il retreival del valore corrente e l'aggiornamento in una transazione lo risolverebbe, ad es.
Begin; select creds from credits where userid=1; do application logic to calculate new value, update credits set credits = 160 where userid = 1; end;
In questo caso è possibile verificare se il nuovo credito sarà < 0 e troncarlo su 0 se i crediti negativi non hanno senso.update credits set creds = creds - 150 where userid=1;
Questo caso non avrebbe bisogno di preoccuparsi di aggiornamenti concorrenti come il DB si occupa del problema di coerenza, ma ha il difetto che creds sarebbero felicemente diventare negativa, che potrebbe non avere senso per alcune applicazioni .
Così semplicemente, qual è il metodo accettato di affrontare il (molto semplice) problema di cui sopra, che cosa succede se il db genera un errore?
Se si è preoccupati di violare i vincoli sulle colonne, definire VINCOLI nel database. – jva