Progressivi e multiutenza

mercoledì 14 febbraio 2007 - 11.59

rob72 Profilo | Newbie

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

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

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

>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

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
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 !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5