Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
SQL Server 2000/2005/2008, Express, Access, MySQL, Oracle
Progressivi e multiutenza
mercoledì 14 febbraio 2007 - 11.59
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
rob72
Profilo
| Newbie
19
messaggi | Data Invio:
mer 14 feb 2007 - 11:59
ciao a tutti
ho un'applicazione sulla quale lavorano più utenti contemporaneamente, che lavora con un database sql 2000;
ogni volta che un utente inserisce un nuovo record eseguo queste istruzioni:
begin tran
select max(nomecampo) + 1 from tabella1
insert into tabella1 values (progressivo ottenuto dalla select sopra, elenco campi, ecc)
select max(nomecampo) + 1 from tabella2
insert into tabella2 values (progressivo ottenuto dalla select sopra, elenco campi, ecc)
commit tran
avendo racchiuso tutto in un'unica transazione, mi aspettavo che le select venissero eseguite da un altro utente solo dopo il commit della transazione
invece capita che se più utenti salvano i dati simultaneamente, ai record vengono attribuiti progressivi uguali
uso delle select max perché vorrei evitare di usare campi autoincrementanti
potete aiutarmi?
grazie mille in anticipo!
morellia
Profilo
| Newbie
6
messaggi | Data Invio:
mer 14 feb 2007 - 12:09
Devi bloccare la tabella per tutto il periodo in cui calcoli il nuovo progressivo usando l'istruzione "HOLDLOCK" nella prima select.
il blocco poi svanisce alla fine della transazione.
Spero di averti aiutato.
Ciao
Andrea
rob72
Profilo
| Newbie
19
messaggi | Data Invio:
mer 14 feb 2007 - 12:42
innanzitutto grazie per il suggerimento
ho fatto una prova aprendo un query analyzer su un pc e un altro su un altro pc
ho aperto un transazione ed eseguito la select sul primo (senza dare commit ovviamente);
ho aperto un'altra transazione sull'altro pc facendo la stessa select, però mi restituisce lo stesso valore della prima
quello che vorrei ottenere è che la select sul secondo pc rimanga in 'standby' fino a che non è stata chiusa la transazione sul primo in modo da ottenere un nuovo progressivo dopo che è il primo è stato attribuito (evitando così valori duplicati)
non so se mi sono spiegato bene...
bluland
Profilo
| Guru
1.149
messaggi | Data Invio:
gio 15 feb 2007 - 11:21
>ciao a tutti
>ho un'applicazione sulla quale lavorano più utenti contemporaneamente,
>che lavora con un database sql 2000;
>ogni volta che un utente inserisce un nuovo record eseguo queste
>istruzioni:
>
>begin tran
>select max(nomecampo) + 1 from tabella1
>insert into tabella1 values (progressivo ottenuto dalla select
>sopra, elenco campi, ecc)
>select max(nomecampo) + 1 from tabella2
>insert into tabella2 values (progressivo ottenuto dalla select
>sopra, elenco campi, ecc)
>commit tran
>
>avendo racchiuso tutto in un'unica transazione, mi aspettavo
>che le select venissero eseguite da un altro utente solo dopo
>il commit della transazione
>
>invece capita che se più utenti salvano i dati simultaneamente,
>ai record vengono attribuiti progressivi uguali
>uso delle select max perché vorrei evitare di usare campi autoincrementanti
>potete aiutarmi?
>grazie mille in anticipo!
>
prova cosi:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
begin tran
select max(nomecampo) + 1 from tabella1
insert into tabella1 values (progressivo ottenuto dalla select
sopra, elenco campi, ecc)
select max(nomecampo) + 1 from tabella2
insert into tabella2 values (progressivo ottenuto dalla select
sopra, elenco campi, ecc)
commit trans
saluti
--------------------
Vincenzo PESANTE
rob72
Profilo
| Newbie
19
messaggi | Data Invio:
gio 15 feb 2007 - 12:57
ho risolto il problema in un altro modo:
ho creato un indice univoco su ogni tabella in modo da prevenire l'inserimento di record duplicati;
nel codice del programma gestisco l'eccezione generata in caso di chiave duplicata e, in quest'ultimo caso, ripeto l'operazione di attribuzione del codice e successivo inserimento fino a che non va a buon fine
comunque grazie a tutti per l'aiuto
Torna su
Stanze Forum
Elenco Threads
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?
Dopo esserti registrato potrai chiedere
aiuto sul nostro
Forum
oppure aiutare gli altri
Consulta le
Stanze
disponibili.
Registrati ora !