Question

J'ai un problème où il semble que lors de l'exécution de la même procédure stockée en même temps de deux instances différentes de la même application, il est hors délai, et je me demandais s'il y avait tout ce que je pouvais faire pour le résoudre?

Je crois que le problème est dans la façon dont les poignées SQL Server 2008 lui-même, de verrouillage des lignes et l'exécution des choses que je ... SPs ne sais pas vraiment beaucoup sur. L'application utilise ADODB.Command pour exécuter la SP.

I ai une VB6 exe (App.exe), en cours d'exécution sur les multiples fois un serveur. Cette application appelle une procédure stockée sur la base de données qui retourne le prochain numéro de séquence pour cette application. Ce champ de numéro de séquence est unique pour l'instance de l'application. - il y a une ligne dans une table (tbl_SequenceNos) pour chaque instance de l'application en cours d'exécution

Ainsi, par exemple, disons que nous avons en cours d'exécution: App[a].exe et App[b].exe

ressemble tblSequenceNos comme:

iAppNo| iNextSequenceNo
  a   |     1234 
  b   |     4567

La procédure stockée pour obtenir le numéro de séquence suivant est relativement simple:

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

Lorsque les deux App[a].exe et essayer de App[b].exe pour exécuter cette procédure pour obtenir leur valeur NextSequenceNo, ils sont suspendus pour environ 30Secs (délai d'attente ADO?).

Parce que chaque application ne regarde jamais la chaque ligne d'autres, je pensais que cela fonctionnerait en même temps sans specifing un verrouillage spécial. Y at-il quelque chose que je suis absent? Je pensais que je dois préciser pour verrouiller la ligne, et non toute la table ou la page? -. Je ne sais pas ce que SQL2008 fait par défaut

Toute aide est grandement appréciée! Merci d'avance Andrew

Était-ce utile?

La solution

Votre procédure est pas sûre et produira des résultats incorrects car entre la sélection et les fils de plusieurs de mise à jour peut obtenir la même séquence n °.

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  

Assurez-vous également que votre colonne iAppNo est indexé. (Ce qui signifie un index sur cette colonne uniquement ou un indice où ce domaine est le premier champ dans l'index)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top