Problemi di concorrenza di record

mercoledì 03 ottobre 2007 - 15.30

LeonDom Profilo | Senior Member

ariecchime...

ho questo problema ora:
ho 5 pc che si collegano ad una pagina e potrebbero collegarsi contemporaneamente, devono prendere un singolo nominativo e lavorarlo. Come posso fare per impedire che lo stesso record venga richiamato da due utenti o più utenti contemporaneamente?


LeonDom

amelix Profilo | Expert

Io imposterei una data di "ultimo accesso" che usi per ordinare i record e poi prendi il più vecchio:
SELECT TOP 1 * FROM TBL1 ORDER BY "ultimo accesso"

Andrea - http://www.MelisWeb.eu/

LeonDom Profilo | Senior Member

in questo modo però non è detto che due persone prendano due record diversi. O meglio potrebbero accere alla select entrambi e prendere lo stesso record. Esiste un blocco di record che non può essere preso da un'altro utente se uno già ci sta lavorando?


LeonDom

amelix Profilo | Expert

Potresti farti una stored procedure che fa tutto in una unica operazione Select e Update.

Ma loro possono scegliere?
Andrea - http://www.MelisWeb.eu/

LeonDom Profilo | Senior Member

No non possono scegliere, o meglio non devono poter scegliere se entrano in una certa modalità.

Avevo pensato ad una stored. e ad un update del record con il nome dell'utente che lo deve lavorare.

Quindi mi faccio la select e la ordino in base ad una data (timestamp) e al null del campo che andrò a riempire con la user di chi lo ha preso.
Faccio un update del campo con una stored e poi lo faccio lavorare al tizio che lo ha richiamato. che te ne pare?
LeonDom

amelix Profilo | Expert

Funziona...
Ma io userei il timestamp come clausola where nell'update per essere sicuro che l'update sia corretto.


Andrea - http://www.MelisWeb.eu/

LeonDom Profilo | Senior Member

credo che proverò in questo modo, anche perché, non me ne vengono di migliori in mente...
LeonDom

Wamba Profilo | Expert

Scusate se mi intrometto, ma se segni in una struttura Static o in una variabile application gli id in lavorazione? Quando esegui la queri ti basta applicare una clausola where I_ID not in (...)
-----------------------------------------------------------
Solo chi ha il Caos dentro può generare una stella danzante
Wamba

LeonDom Profilo | Senior Member

grazie wamba è un'altro tentativo che potrei fare.
LeonDom

Wamba Profilo | Expert

Di niente figurati, facci sapere com'è finita
-----------------------------------------------------------
Solo chi ha il Caos dentro può generare una stella danzante
Wamba

LeonDom Profilo | Senior Member

Buongiorno a tutti, riprendo questo post. Non ho molta familiarità con le stored.

Come faccio a fare Select e Update in un unica Procedure?

CREATE PROC sp_Assegnazione
@UserID nvarchar(50),
@ExtendedID nvarchar (5)
AS

DECLARE @Ret int

-- Prelevo il primo record per l'update--
SELECT Top 1 MIO_ID FROM MIA_TABELLA
WHERE extended = 'N'
ORDER By Change

-- Tento di fare l'update
UPDATE MIA_TABELLA
SET U_ID = @UserID, extended_ID = @ExtendedID
WHERE MIO_ID = @Ret

EXEC sp_Assegnazione 'Admin', 'Z'
GO

..Il comando o i comandi sono stati completati.

Però non mi fa l'update di niente... qualcuno può aiutarmi?


LeonDom

amelix Profilo | Expert

Hai dimenticato di valorizzare @Ret.
Andrea - http://www.MelisWeb.eu/

LeonDom Profilo | Senior Member

anche in questo modo non fa niente

CREATE PROC sp_Assegnazione
@UserID nvarchar(50),
@ExtendedID nvarchar (5)
AS

DECLARE @Ret int

-- Prelevo il primo record per l'update--
SET @Ret = (SELECT Top 1 MIO_ID FROM MIA_TABELLA
WHERE extended = 'N'
ORDER By Change)

-- Tento di fare l'update
UPDATE MIA_TABELLA
SET U_ID = @UserID, extended_ID = @ExtendedID
WHERE MIO_ID = @Ret

EXEC sp_Assegnazione 'Admin', 'Z'
GO

LeonDom

amelix Profilo | Expert

Domanda: i campi extended e extended_ID sono diversi o hai sbagliato a scrivere?

>SET @Ret = (SELECT Top 1 MIO_ID FROM MIA_TABELLA
>WHERE extended = 'N'
>ORDER By Change)

>UPDATE MIA_TABELLA
>SET U_ID = @UserID, extended_ID = @ExtendedID
>WHERE MIO_ID = @Ret


Andrea - http://www.MelisWeb.eu/

LeonDom Profilo | Senior Member

Avevo sbagliato a scrivere... ma ho risolto con la tua indicazione, ora funziona. Spero solo che mi serva a fare in modo che non ci siano concomitanze...

LeonDom
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5