Délai de verrou de requête dépassé MS SQL

Sebcmoi62 Messages postés 4 Date d'inscription mardi 24 janvier 2006 Statut Membre Dernière intervention 18 décembre 2012 - 13 juil. 2012 à 12:37
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 - 16 juil. 2012 à 20:14
Bonjour,

Mon problème est que j'ai cette erreur 1222 : Délai de verrou de requête dépassé.

Alors elle se passe dans deux cas, toujours avec une transaction.

1er cas :
DELETE FROM matable suivit de INSERT INTO matable

2eme cas:
juste au deuxième insert dans une même table

J'ai essayé plusieurs type de level de blocage. mais cela revient sans cesse.

Des idées, c'est assez urgent.

Merci

3 réponses

yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
13 juil. 2012 à 13:49
Salut,

J'ai eu 1 cas similaire avec des transactions "nommées" et des accès concurents.
le fait de revenir à des transactions "anonymes" à partiellement corrigé le problème.
De plus j'ai utilisé l'annulation de transaction automatique et
un try/catch afin de repérer l'erreur de lock et pouvoir réessayer l'instruction SQL plusieurs fois ou jusqu'à ce que l'instruction soit réussie, cela donnait à peu près un truc du genre :

(Ceci ne convient QUE pour les problèmes d'accès concurents/locks,
il se peut que ce ne soit pas la solution à ton problème)

SET XACT_ABORT ON;

DECLARE @maxRetry int ; SET @maxRetry = 5
DECLARE @lastError int

RETRY_COMMAND:
SET @lastError = 0

BEGIN TRY
    BEGIN TRANSACTION
        -- INSERT / UPDATE / DELETE
        -- (...)
    COMMIT TRAN
END TRY
BEGIN CATCH
    print ERREOR_MESSAGE()
    SET @lastError = ERROR_NUMBER()
    IF XACT_STATE() = -1
        ROLLBACK TRAN;
    -- Ici si erreur de lock, alors recommence dans une seconde
    IF @lastError in(1222, 1207) and @maxRetry > 0
    BEGIN
        WAITFOR delay '00:00:01'
        SET @maxRetry = @maxRetry - 1 
        GOTO RETRY_COMMAND;
    END
END CATCH

IF @lastError = 0
    print 'SUCCES'
ELSE
    print 'ECHEC'


Il faut vérifier le numéro d'erreur 1207, je ne me rappelle plus exactement si c'est bien ça.

bye...
0
Rejoignez-nous