Punto informatico Network
Login Esegui login | Non sei registrato? Iscriviti ora (è gratuito!)
Username: Password:
  • Annuncio Pubblicitario

[SQL - Database] Campo autoincrementante

Il forum per tutti i developer. Leggere attentamente il regolamento di sezione prima di postare.

[SQL - Database] Campo autoincrementante

Messaggioda DilanDog » mar mag 24, 2005 2:36 pm

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]
Avatar utente
DilanDog
Senior Member
Senior Member
 
Messaggi: 208
Iscritto il: ven apr 15, 2005 9:13 am
Località: Milano

Messaggioda Zane » mar mag 24, 2005 3:18 pm

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...
Avatar utente
Zane
MLI Hero
MLI Hero
 
Messaggi: 7935
Iscritto il: lun ago 05, 2002 9:36 am
Località: Ferrara

Messaggioda DilanDog » mar mag 24, 2005 5:08 pm

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....
Avatar utente
DilanDog
Senior Member
Senior Member
 
Messaggi: 208
Iscritto il: ven apr 15, 2005 9:13 am
Località: Milano


Messaggioda Zane » mar mag 24, 2005 9:12 pm

Purtroppo nn saprei cosa dirti per la gestione della concorrenza: secondo me ci sarebbe di rivedere un po' tutta l'applicazione...
Avatar utente
Zane
MLI Hero
MLI Hero
 
Messaggi: 7935
Iscritto il: lun ago 05, 2002 9:36 am
Località: Ferrara

Messaggioda DilanDog » mer mag 25, 2005 4:33 pm

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+]
Avatar utente
DilanDog
Senior Member
Senior Member
 
Messaggi: 208
Iscritto il: ven apr 15, 2005 9:13 am
Località: Milano

Messaggioda Xerex » mer mag 25, 2005 5:47 pm

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...
Fare la grigliata, è sempre una figata!
Avatar utente
Xerex
Membro Ufficiale (Gold)
Membro Ufficiale (Gold)
 
Messaggi: 5948
Iscritto il: lun ago 05, 2002 9:36 am
Località: Parma(Pr)


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 0 ospiti

Powered by phpBB © 2002, 2005, 2007, 2008 phpBB Group
Traduzione Italiana phpBB.it

megalab.it: testata telematica quotidiana registrata al Tribunale di Cosenza n. 22/09 del 13.08.2009, editore Master New Media S.r.l.; © Copyright 2008 Master New Media S.r.l. a socio unico - P.I. 02947530784. GRUPPO EDIZIONI MASTER Spa Tutti i diritti sono riservati. Per la pubblicità: Master Advertising