-
Locks sur un Insert
Bonjour,
Je suis sous SQL Server 2000, j'ai besoin dans mon developpement d'executer l'instruction suivante:
Insert Into ContractPositionDetails(ContractPositionId, SecurityId, Quantity, Price, PriceCurrencyId, PriceEUR, PriceDate, Evaluation,
EvaluationEUR, AveragePriceEUR)
Select ContractPositions.ContractPositionId, Securities.SecurityId, BufferSwlInContractPositionDetails.Quantity, BufferSwlInContractPositionDetails.Price,
'EUR', BufferSwlInContractPositionDetails.Price, BufferSwlInContractPositionDetails.PriceDate,
BufferSwlInContractPositionDetails.Evaluation, BufferSwlInContractPositionDetails.Evaluation,
BufferSwlInContractPositionDetails.AveragePrice
From ((BufferSwlInContractPositionDetails Inner Join Contracts On Contracts.ContractCompanyReference = BufferSwlInContractPositionDetails.ContractCompanyReference)
Inner Join ContractPositions On ContractPositions.ContractId = Contracts.ContractId And ContractPositions.SituationDate = BufferSwlInContractPositionDetails.SituationDate)
Inner Join Securities On Securities.IsinCode = BufferSwlInContractPositionDetails.SecurityCode
Where ContractPositions.lotId = @p_intSittingId
La plupart du temps, cela s'execute sans probleme mais parfois cela me crée des locks en Mode X ou IX. J'en ai un de type KEY, plein d'autre de type PAG et un de type TAB.
J'ai crée des index sur les champs de la partie WHERE.
Connaissez vous des pistes pour resoudre ce probleme car j'ai l'impression que c'est la requete elle- meme qui se bloque!
Merci d'avance,
Knightrider
-
t'aurais pas des triggers sur tes tables ?
ou des contraintes ?
-
J'ai une contrainte sur ContractPositionId et SecurityId sur la table ContractPositionDetails. Il y a une autre contraite sur ContractId dans ContractPositions.
En fait cette requete est contenue dans une procedure stockée execute dans un lot DTS donc la requete est execute à travers une transaction Read Committed.
J'ai essaye de définir le niveau de Lock sur la table ContractPositionDetails avec With(ROWLOCK) sans résultat, j'ai toujours des PAGLOCK.
-
essaies avec NOLOCK directement et regarde
-
Je viens de trouver que ma requete est bloque sur ContractPositions.LotId = @p_intSittingId. En fait la requete Select bloque à cause de cette instruction.
Par contre si je l'execute lorsque je suis en dehors de mon lot DTS tout fonctionne. Ce qui est bizarre ma jointure sur le champ SituationDate et ContractId sur la table ContractPositions ne peut renvoyer qu'une seule ligne.
Je comprend donc pas comment ContractPositions.LotId = @p_intSittingId peut me bloquer ma requete ?
-
En fait, le probleme ne venait pas de la ligne de mon precedent message.
En fait, j'ai juste modifie l'ordre des clauses dans le where. Etrange mais mon probleme semble resolu ...