|
|
|
#1 |
|
Messages: n/a
Hébergeur: |
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 |
|
|
|
#2 |
|
Messages: n/a
Hébergeur: |
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 > > |
|
|
|
#3 |
|
Messages: n/a
Hébergeur: |
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 > > |
|
|
|
#4 |
|
Messages: n/a
Hébergeur: |
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 |
|
|
|
#5 |
|
Messages: n/a
Hébergeur: |
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 >> >> > |
|
|
|
#6 |
|
Messages: n/a
Hébergeur: |
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 |
|
![]() |
| Outils de la discussion | |
|
|