Domanda

Ho un problema in cui sembra che durante l'esecuzione della stessa stored procedure, allo stesso tempo da due diverse istanze della stessa applicazione si è timeout, e si chiese se c'era qualcosa che potessi fare per risolverlo?

Credo che il problema è nel modo in cui SQL Server 2008 si manici, chiusura file e l'esecuzione della SP ... Le cose che non sanno molto a proposito. Gli usi app ADODB.Command per eseguire la SP.

Ho un exe VB6 (App.exe), in esecuzione sui più volte un server. Questa applicazione chiama una stored procedure sul database che restituisce il numero di sequenza successivo per tale applicazione. Questo campo numero di sequenza è unica per l'istanza dell'applicazione -. V'è 1 riga in una tabella (tbl_SequenceNos) per ogni istanza dell'applicazione in esecuzione

Così, per esempio, dire che abbiamo in esecuzione: App[a].exe e App[b].exe

sguardi tblSequenceNos come:

iAppNo| iNextSequenceNo
  a   |     1234 
  b   |     4567

La stored procedure per ottenere il numero di sequenza successiva è relativamente semplice:

CREATE PROEDURE GetNextSequenceNo (@AppNo varchar(1), @NextSequenceNo int output)
AS
BEGIN
    DECLARE @TempSequenceNo int

    SELECT @NextSequenceNo = iNextSequenceNo 
    FROM tblSequenceNos 
    WHERE iAppNo = @AppNo

    @NextSequenceNo = @NextSequenceNo + 1

    UPDATE tblSequenceNos 
    SET iNextSequenceNo = @NextSequenceNo
    WHERE iAppNo = @AppNo

END

Quando sia App[a].exe e App[b].exe tenta di eseguire questa procedura per ottenere il loro valore NextSequenceNo, sono appesi per circa 30Sec (timeout ADO?).

Dato che ogni applicazione non guarda mai la fila ogni altri, ho pensato che questo dovrebbe funzionare contemporaneamente senza specificare un blocco speciale. C'è qualcosa che mi manca? Ho pensato che forse ho bisogno di specificare per bloccare solo la riga, non l'intera tabella o pagina? -. Non so che cosa SQL2008 fa di default

Ogni aiuto è molto apprezzato! Grazie in anticipo Andrew

È stato utile?

Soluzione

La procedura non è thread sicuro e produrrà risultati non corretti perché tra la selezione e la filettatura aggiorna più potrebbe ottenere la stessa sequenza nr.

CREATE PROCEDURE GetNextSequenceNo (@AppNo varchar(1), @NextSequenceNo int output)
AS

 DECLARE @var table(seq int);

 UPDATE tblSequenceNos 
    SET iNextSequenceNo = @NextSequenceNo + 1
 OUTPUT inserted.iNextSequenceNo INTO @var;
  WHERE iAppNo = @AppNo

  select @NextSequenceNo = seq from @var
GO  

Assicurarsi inoltre la colonna iAppNo è indicizzato. (Questo significa un indice su questa colonna solo o di un indice in cui questo campo è il primo campo nell'indice)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top