PDA

View Full Version : Problema con DB


Ciovo
20-12-2004, 15:39
Nella realizzazione di un sito web mi trovo di fronte a questo problema: devo prendere dal database (Oracle, in questo caso) il massimo di una chiave primaria di una tabella (che è generata tramite una sequence, per cui è un contatore), poi dal sito fatto in jsp (java) ricevere il valore e inserire nella tabella il numero aumentato di uno. Questo perchè ho bisogno del valore durante la sessione per effettuare inserimenti successivi. Quello che voglio evitare è che altro possa leggere il dato prima che l'inserimento successivo incrementi il valore... Voglio dire... uno prende il valore 5 (il massimo fra le chiavi), e prima che inserisca la riga nella tabella con il valore 6, arriva un altro e prende di nuovo 5... vorrei che le azioni di select e successivamente di insert fossero atomiche, o che solo una persona alla volta potesse eseguire queste due (o più, volendo) operazioni.
L'alternativa sarebbe lasciar gestire l'incremento del contatore al database, e però farsi "ritornare" il valore... ma questo credo che non sia possibile...

Qualcuno mi può illuminare?!
Grazie!

cionci
20-12-2004, 17:05
Usa una transazione ;)

http://www-db.stanford.edu/~ullman/fcdb/oracle/or-jdbc.html#transactions

Brigante
20-12-2004, 19:09
Non ho ben capito come funziona il tutto, comunque, la tabella dove leggi il numero non è la stessa di dove lo vai a scrivere? Altrimenti si incrementerebbe da solo, non vedo perchè devi preoccupartene tu. Invece se la tabelle sono diverse ti conviene, prima di fare la INSERT per scrivere i dati, andarti a leggere il numero progressivo, lo incrementi di 1 e scrivi il tutto.

Ciovo
20-12-2004, 19:15
Pensavo servisse "solo" a soddisfare il principio "o si fa tutto, o niente", non che gestisse anche la concorrenza...
Mi suonava un po' strano pensare che semplicemente con un autocommit si risolvessero brillantemente (è ironico...) problemi che molti linguaggi di programmazione neppure affrontano e altri affrontano in maniera grossolana...

Grazie mille!