Pagina 1 di 1

[SQL - Database] Campo autoincrementante

MessaggioInviato: mar mag 24, 2005 2:36 pm
da DilanDog
Il campo autoincrementante sui database ha i suoi pro ed i suoi contro, e proprio per questa seconda caratteristica sto pensando di evitare di utilizzarli per operazioni che prevedano codici univoci, soprattutto per l'impossibilità di modificare questo campo in caso di necessità.

Si pone a questo punto un altro problema: come ottenere un numero univoco su un database multiutenza? La funzione SQL Max(nomecampo)+1 potrebbe essere un ottimo metodo, ma in caso di operazioni in contemporanea da parte di più utenti come evitare di ritrovarmi due record con lo stesso numero?

Mi spiego meglio. Siccome la sfiga non dorme mai, diciamo che su tre client viene eseguito in contemporanea, o quasi, un codice di questo tipo:


SELECT..... MAX(CampoUnivoco) AS x.... (per ottenere il numero più alto memorizzato per questo campo)

CampoUnivoco=x+1 (per creare il campo univoco, ovvero il nuumero più alto +1)

Creazione del nuovo record


Succede che per tutti e tre i client MAX(Campounivoco) porta lo stesso risultato in quanto l'operazione di scrittura non è ancora stata eseguita...e di conseguenza mi ritrovo con tre record con lo stesso valore associato a Campounivoco! [boxed]

Capito? Cosa suggerite? Che ogni client blocchi l'accesso in scrittura su quella tabella fino a quando non è stato inserito il nuovo record? Altre opzioni più "flessibili" e meno drastiche non ne conoscete? [cry]

MessaggioInviato: mar mag 24, 2005 3:18 pm
da Zane
Non sono sicuro di aver capito quello che vuoi fare, ma i campi auto andrebbero usati solamente per gestire delle chiavi primarie, gestendo a mano tutto il resto...

MessaggioInviato: mar mag 24, 2005 5:08 pm
da DilanDog
Zane ha scritto:Non sono sicuro di aver capito quello che vuoi fare, ma i campi auto andrebbero usati solamente per gestire delle chiavi primarie, gestendo a mano tutto il resto...


infatti, per le chiavi primarie vanno benissimo. Su un vecchio software però ho utilizzato lo stesso codice per collegare i nomi di file audio ai record di un database, in modo da avere codici audio sicuramente univoci, ed è in questo caso che sarebbe stato meglio avere la possibilità di modificare questi codici, cosa impossibile per un campo autoincrementante. In questi casi mi servirebbe implementare qualcosa di simile al campo auto ma gestito da me, ed è così che sono arrivato al quesito che ho postato qui: come essere sicuro che un codice numerico sia sicuramente univoco in caso di aggiunta di nuovi record in contemporanea da più client?

Inoltre su alcuni database (mysql versione precedente alla quattro, credo...ma non vorrei dire str...ate) il campo Auto non è disponibile, quindi per forza di cose è da gestire manualmente....o sbaglio? [banned] Anche qui si ripropone lo stesso problema....

MessaggioInviato: mar mag 24, 2005 9:12 pm
da Zane
Purtroppo nn saprei cosa dirti per la gestione della concorrenza: secondo me ci sarebbe di rivedere un po' tutta l'applicazione...

MessaggioInviato: mer mag 25, 2005 4:33 pm
da DilanDog
Zane ha scritto:Purtroppo nn saprei cosa dirti per la gestione della concorrenza: secondo me ci sarebbe di rivedere un po' tutta l'applicazione...


Incoraggiante... [cry+]

MessaggioInviato: mer mag 25, 2005 5:47 pm
da Xerex
Parlo solo a livello teorico, ma in ogni DBMS che si possa chiamare tale, sussistono le proprieta' ACID, una di queste fa in modo che in caso di operazioni contemporanee, l'accesso al database in scrittura sia singolo!
in generale non dovrebbe accadera mai, in modo del tutto automatico, che piu di una transazione in scrittura venga eseguita contemporaneamente ad un'altra.
riguardo al tuo problema la prima idea che mi viene in mente, sarebbe il controllo della presenza della stessa chiave prima di fare l'inserimento, e, se trovata libera, scritta immediatamente...