Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

VERROU ?

5 réponses
Avatar
msnews.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

5 réponses

Avatar
TheSteph
Peut être en rajoutant ceci avant BEGIN TRANS :

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

Steph.


"msnews.microsoft.com" wrote in message
news:
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




Avatar
Patrice
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" a écrit dans le message de
groupe de discussion :
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




Avatar
Fred
Dans : news:,
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

Avatar
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:
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" a écrit dans le message
de groupe de discussion :

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







Avatar
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" a écrit dans le message de
news:%
Dans : news:,
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