PHWinfo banniere

Titres
PORTAIL ANNUAIRE ARTICLES COMPARATEUR HÉBERGEURS DEVIS FORUMS RÉDUCTEUR D'URL
Précédent   PHWinfo > Forums Hébergement > Forum Hébergement serveur > ms.public.fr.sqlserver > VERROU ?
S'inscrire FAQ Membres Recherche Messages du jour Marquer les forums comme lus
VERROU ?

Réponse
 
LinkBack Outils de la discussion
Vieux 05/09/2008, 10h14   #1
msnews.microsoft.com
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut VERROU ?

Bonjour à tous,

dans le cadre d'un spool j'ai plusieurs process qui scannent une table pour
récupérer un enregistrement.
celui une fois capturé change d'etat pour ne pas etre pris par un autre
processus.


en fait je m'apercoit qu'ils sont attrappés par plusieurs process mais
attendent sagement la fin du lock.
hors j'aimerais plutot qu'ils passent au suivant si la ligne est lockée

comment puis-je proceder ?

voila un peu de code pour vous aider à comprendre


CREATE TABLE TEST (CLE_TEST INT NOT NULL IDENTITY(1,1) PRIMARY KEY, STATUT
INT DEFAULT(0), PRIORITE INT DEFAULT(50))
INSERT INTO TEST (STATUT, PRIORITE) VALUES (1,50)
INSERT INTO TEST (STATUT, PRIORITE) VALUES (1,80)


----ICI c'est la partie qu'executent chaque process pour prendre
l'enregistrement à traiter
-- je suppose que dans le select je dois pouvoir preciser que je ne veux pas
attrapper les enresgitreùent sous lock

DECLARE @CLE_TEST INT

BEGIN TRAN

SELECT TOP 1 @CLE_TEST = CLE_TEST
FROM TEST
WHERE statut = 1
ORDER BY PRIORITE DESC

UPDATE test SET [STATUT] = 2 WHERE [CLE_TEST] = @CLE_TEST

COMMIT


  Réponse avec citation
Vieux 05/09/2008, 12h29   #2
TheSteph
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: VERROU ?

Peut être en rajoutant ceci avant BEGIN TRANS :

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

Steph.


"msnews.microsoft.com" <christophe.perez@pjms.fr> wrote in message
news:7FA4B58B-3A67-431B-8C98-D00B9B32B9A1@microsoft.com...
> Bonjour à tous,
>
> dans le cadre d'un spool j'ai plusieurs process qui scannent une table
> pour
> récupérer un enregistrement.
> celui une fois capturé change d'etat pour ne pas etre pris par un autre
> processus.
>
>
> en fait je m'apercoit qu'ils sont attrappés par plusieurs process mais
> attendent sagement la fin du lock.
> hors j'aimerais plutot qu'ils passent au suivant si la ligne est lockée
>
> comment puis-je proceder ?
>
> voila un peu de code pour vous aider à comprendre
>
>
> CREATE TABLE TEST (CLE_TEST INT NOT NULL IDENTITY(1,1) PRIMARY KEY, STATUT
> INT DEFAULT(0), PRIORITE INT DEFAULT(50))
> INSERT INTO TEST (STATUT, PRIORITE) VALUES (1,50)
> INSERT INTO TEST (STATUT, PRIORITE) VALUES (1,80)
>
>
> ----ICI c'est la partie qu'executent chaque process pour prendre
> l'enregistrement à traiter
> -- je suppose que dans le select je dois pouvoir preciser que je ne veux
> pas
> attrapper les enresgitreùent sous lock
>
> DECLARE @CLE_TEST INT
>
> BEGIN TRAN
>
> SELECT TOP 1 @CLE_TEST = CLE_TEST
> FROM TEST
> WHERE statut = 1
> ORDER BY PRIORITE DESC
>
> UPDATE test SET [STATUT] = 2 WHERE [CLE_TEST] = @CLE_TEST
>
> COMMIT
>
>



  Réponse avec citation
Vieux 05/09/2008, 14h32   #3
Patrice
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: VERROU ?

Bonjour,

Je ne suis sans doute pas très au point sur le sujet mais si on a déjà un
problème avec une transaction très simple (sinon sans tout le code le
contexte global peut aider) au point de vouloir sauter les enregistrements
verrouillés, tout mécanisme en ce sens à mon avis ne fera qu'ajouter au
problème. Un peu au feeling je dirais :
- voir déjà si le problème n'est pas que le SELECT parcours plus
d'enregistrements que nécessaire j'essaierai par exemple un ORDER BY
PRIORITE,CLE_TEST avec l'index correspondant
- attention à ce que le nombre de process ne soit pas contreproductif
- en écrivant je me dis que l'on pourrait aussi imaginer qu'un process
prenne préférentiellement d'autres enregistrements que les autres process
(peut-être via un modulo par exemple) mais je creuserais d'abord pour voir
donc si les locks peuvent être plus courts...

--
Patrice

"msnews.microsoft.com" <christophe.perez@pjms.fr> a écrit dans le message de
groupe de discussion : 7FA4B58B-3A67-431B-8C98-D00B9B32B9A1@microsoft.com...
> Bonjour à tous,
>
> dans le cadre d'un spool j'ai plusieurs process qui scannent une table
> pour
> récupérer un enregistrement.
> celui une fois capturé change d'etat pour ne pas etre pris par un autre
> processus.
>
>
> en fait je m'apercoit qu'ils sont attrappés par plusieurs process mais
> attendent sagement la fin du lock.
> hors j'aimerais plutot qu'ils passent au suivant si la ligne est lockée
>
> comment puis-je proceder ?
>
> voila un peu de code pour vous aider à comprendre
>
>
> CREATE TABLE TEST (CLE_TEST INT NOT NULL IDENTITY(1,1) PRIMARY KEY, STATUT
> INT DEFAULT(0), PRIORITE INT DEFAULT(50))
> INSERT INTO TEST (STATUT, PRIORITE) VALUES (1,50)
> INSERT INTO TEST (STATUT, PRIORITE) VALUES (1,80)
>
>
> ----ICI c'est la partie qu'executent chaque process pour prendre
> l'enregistrement à traiter
> -- je suppose que dans le select je dois pouvoir preciser que je ne veux
> pas
> attrapper les enresgitreùent sous lock
>
> DECLARE @CLE_TEST INT
>
> BEGIN TRAN
>
> SELECT TOP 1 @CLE_TEST = CLE_TEST
> FROM TEST
> WHERE statut = 1
> ORDER BY PRIORITE DESC
>
> UPDATE test SET [STATUT] = 2 WHERE [CLE_TEST] = @CLE_TEST
>
> COMMIT
>
>


  Réponse avec citation
Vieux 05/09/2008, 14h58   #4
Fred
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: VERROU ?

Dans : news:7FA4B58B-3A67-431B-8C98-D00B9B32B9A1@microsoft.com,
msnews.microsoft.com écrivait :
> Bonjour à tous,
>
> dans le cadre d'un spool j'ai plusieurs process qui scannent une
> table pour récupérer un enregistrement.
> celui une fois capturé change d'etat pour ne pas etre pris par un
> autre processus.
>
>
> en fait je m'apercoit qu'ils sont attrappés par plusieurs process mais
> attendent sagement la fin du lock.
> hors j'aimerais plutot qu'ils passent au suivant si la ligne est
> lockée
> comment puis-je proceder ?


As-tu essayé de faire l'opération en une seule commande SQL ?

Quelque chose comme :
UPDATE TEST
SET [STATUT] = 2
FROM (SELECT TOP 1 @CLE_TEST = CLE_TEST
FROM TEST
WHERE [STATUT] = 1)

--
Fred
foleide@free.fr

  Réponse avec citation
Vieux 05/09/2008, 21h07   #5
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: VERROU ?

Bonsoir Patrice j'avoue ne pas avoir tout suivi à ce que tu veux dire.
toujours est'il que le probleme c'est que le select renvoi un seul
enregistrement celui à traiter.

en fait le tout est sous une transaction de type serializable

le select prend la ligne dispo via un order de priorité.
passe cette derniere à un etat on va dire 2 qui ne fait plus partie du
select donc exclu les autre select.
toutefois comme se sont des process paralellisés il arrive que certain ai pu
attraper la meme ligne mais comme c'est sous transaction le 2e attends
sagement la disponibilité de la ligne. hors j'aimerais justement qu'elle
passe a la suivante du coup....

voila la philo



"Patrice" <http://www.chez.com/scribe/> a écrit dans le message de
news:5364BE21-E0E3-4ADF-B30F-0074F0F35F4B@microsoft.com...
> Bonjour,
>
> Je ne suis sans doute pas très au point sur le sujet mais si on a déjà un
> problème avec une transaction très simple (sinon sans tout le code le
> contexte global peut aider) au point de vouloir sauter les enregistrements
> verrouillés, tout mécanisme en ce sens à mon avis ne fera qu'ajouter au
> problème. Un peu au feeling je dirais :
> - voir déjà si le problème n'est pas que le SELECT parcours plus
> d'enregistrements que nécessaire j'essaierai par exemple un ORDER BY
> PRIORITE,CLE_TEST avec l'index correspondant
> - attention à ce que le nombre de process ne soit pas contreproductif
> - en écrivant je me dis que l'on pourrait aussi imaginer qu'un process
> prenne préférentiellement d'autres enregistrements que les autres process
> (peut-être via un modulo par exemple) mais je creuserais d'abord pour voir
> donc si les locks peuvent être plus courts...
>
> --
> Patrice
>
> "msnews.microsoft.com" <christophe.perez@pjms.fr> a écrit dans le message
> de groupe de discussion :
> 7FA4B58B-3A67-431B-8C98-D00B9B32B9A1@microsoft.com...
>> Bonjour à tous,
>>
>> dans le cadre d'un spool j'ai plusieurs process qui scannent une table
>> pour
>> récupérer un enregistrement.
>> celui une fois capturé change d'etat pour ne pas etre pris par un autre
>> processus.
>>
>>
>> en fait je m'apercoit qu'ils sont attrappés par plusieurs process mais
>> attendent sagement la fin du lock.
>> hors j'aimerais plutot qu'ils passent au suivant si la ligne est lockée
>>
>> comment puis-je proceder ?
>>
>> voila un peu de code pour vous aider à comprendre
>>
>>
>> CREATE TABLE TEST (CLE_TEST INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
>> STATUT
>> INT DEFAULT(0), PRIORITE INT DEFAULT(50))
>> INSERT INTO TEST (STATUT, PRIORITE) VALUES (1,50)
>> INSERT INTO TEST (STATUT, PRIORITE) VALUES (1,80)
>>
>>
>> ----ICI c'est la partie qu'executent chaque process pour prendre
>> l'enregistrement à traiter
>> -- je suppose que dans le select je dois pouvoir preciser que je ne veux
>> pas
>> attrapper les enresgitreùent sous lock
>>
>> DECLARE @CLE_TEST INT
>>
>> BEGIN TRAN
>>
>> SELECT TOP 1 @CLE_TEST = CLE_TEST
>> FROM TEST
>> WHERE statut = 1
>> ORDER BY PRIORITE DESC
>>
>> UPDATE test SET [STATUT] = 2 WHERE [CLE_TEST] = @CLE_TEST
>>
>> COMMIT
>>
>>

>


  Réponse avec citation
Vieux 06/09/2008, 02h36   #6
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: VERROU ?

Alors apparemment j'ai reçu la soluce !

il faut que dans mon select je rajoute la clause with(readpast) et il saute
les enregistrement sous verrou et donc dans mon cas il prend le suivant
c'est exactement ce que je voulais.


Merci à bruno reiter pour cette soluce.
Ch.



"Fred" <foleide@free.fr.invalid> a écrit dans le message de
news:%23mwXac1DJHA.1180@TK2MSFTNGP04.phx.gbl...
> Dans : news:7FA4B58B-3A67-431B-8C98-D00B9B32B9A1@microsoft.com,
> msnews.microsoft.com écrivait :
>> Bonjour à tous,
>>
>> dans le cadre d'un spool j'ai plusieurs process qui scannent une
>> table pour récupérer un enregistrement.
>> celui une fois capturé change d'etat pour ne pas etre pris par un
>> autre processus.
>>
>>
>> en fait je m'apercoit qu'ils sont attrappés par plusieurs process mais
>> attendent sagement la fin du lock.
>> hors j'aimerais plutot qu'ils passent au suivant si la ligne est
>> lockée
>> comment puis-je proceder ?

>
> As-tu essayé de faire l'opération en une seule commande SQL ?
>
> Quelque chose comme :
> UPDATE TEST
> SET [STATUT] = 2
> FROM (SELECT TOP 1 @CLE_TEST = CLE_TEST
> FROM TEST
> WHERE [STATUT] = 1)
>
> --
> Fred
> foleide@free.fr


  Réponse avec citation
Réponse


Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are oui
Pingbacks are oui
Refbacks are oui


Fuseau horaire GMT +1. Il est actuellement 06h45.


Édité par : vBulletin® version 3.7.3
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.2.0 RC5 Tous droits réservés.
Version française #16 par l'association vBulletin francophone
PHWinfo est un site Éducation Sans Frontières ©2000-2008
Ad Management by RedTyger
©Tous droits réservés par les parties respectives
Page generated in 0,14152 seconds with 14 queries