Newsgroup: it.comp.java
Titolo: livelli di isolamento in Java

Ciao a tutti.
Ho molti dubbi a proposito del livello di isolamento in un DB.
Devo effettuare la seguente operazione:
verificare se un dato e' presente in un DB
se non č presente fare un insert altrimenti l'update sul record secondo
certe condizioni.
Mi e' stato consigliato di utilizzare un "select for update", (il db č
Oracle).
Non ho capito bene come funziona .
Si deve fare la select sulla tabella in cui si vuole fare l'insert?
Nel caso di un insert in una tabella A ad esempio bisogna mettere la
condizione
select * from tabellaA for update?  cosi' mettio un lock sull'intera
tabella??
Inoltre non ho capito che cosa hanno a che fare i livelli di isolamento con
il select for update.
In pratica ho le idee molto confuse.
Mi date qualche consiglio?
Uso Java per eseguire le query
Grazie!ů

Mi sembra che il tuo problema sia di accesso concorrente a una
tabella...
Immagino che ci siano più utenti che possono fare le stesse operazioni 
quindi 
 se non vuoi cercare di inserire due volte la stessa riga o (righe
diverse ma con chiave uguale)
 oppure
 se non vuoi fare update senza che nel frattempo i dati siano cambiati
da
         un'altro utente  
devi  "lock-are" la tabella e poi fare i tuoi inserimenti/update...
Ti hanno detto di usare la select for update appunto per "lock-are" 
la tabella, così i dati rimangono consistenti con quello che ti
aspetti...
Con la SELECT FOR UPDATE  le righe restano allocate 
durante tutta la transazione, quindi non hai problemi di
 "coerenza temporale" delle righe.
Ciao 
--gio 
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 
Da quello che mi dici devi fare una Select, un if sul risultato e se
il Result set ? vuoto eseguire la insert altrimenti l'update. Se hai
paura che tra il tempo 1 in cui esegui la Select e il tempo 2 in cui
esegui l'update qualcuno MODIFICHI i tuoi dati usa una select for
update.
Riguardo ai livelli di isolamento non so cosa siano, e dire che ho
fatto DBA per 7 anni! Forse li chiamo in modo diverso, o non hanno a
che fare con Oracle.
Ciao Cinzia.

 ha scritto nel messaggio
news:683abde2.03090...@posting.google.com...


 ha scritto nel messaggio
news:vmM5b.292090$Ny5.9...@twister2.libero.it...


 Grazie!ù
Se fossi in te eviterei (quando possibili) costrutti dipendenti dal DB che 
utilizzi nel tuo caso Oracle perchè rende la tua app. evidentemente non 
portabile.
Per quanto riguarda il tuo problema di consiglierei di usare le librerie JTA
http://java.sun.com/products/jta/
ed eseguire la tua query con sintassi SQL standard in un contesto 
transazionale che gestisce autonomamente commit e rollback verso il tuo DB.

 il select for update.
Lascia stare i livelli di isolamento ... il default (READ COMMITTED)
e' piu' che sufficiente per il 99.9% delle applicazioni ed e' usato
direi dal 99.999% delle applicazioni, SERIALIZABLE e' in genere troppo
lento e dato che nessuno lo usa pochi sanno come usarlo (lui si che
richiede a select for update...) senza incontrare l'errore "cannot
serialize transaction" ogni secondo, il READ UNCOMMITTED e' una
schifezza inserita solo per essere aderenti agli standard ISO e per
due o tre applicazioni particolarissime.
HTH
Ciao
Alberto