Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/06/2011, 14h21   #1
Candidat au titre de Membre du Club
 
Inscription : septembre 2002
Messages : 26
Détails du profil
Informations forums :
Inscription : septembre 2002
Messages : 26
Points : 13
Points : 13
Par défaut procédure stockée : Verrou / accès concurrent

Bonjour,

Je souhaiterais empêcher tout accès concurrent sur l'exécution d'une procédure stockée (comme le ferait un Mutex) : Si un autre appel intervient pendant son exécution je voudrait que l'appel ne lance pas l'exécution tant que le précédent n'est pas exécuté (ou ne lance rien du tout).

Est-ce quelque chose d'intégré dans Sql Server ?

merci

Florent
florent_g est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2011, 15h57   #2
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 669
Points : 8 729
Points : 8 729
Bonjour,

Il vous suffit pour cela de spécifier le niveau d'isolation de transaction SERIALIZABLE dès le début de votre procédure stockée, et de transactionner explicitement l'ensemble de vos requêtes :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE PROCEDURE maProcedure
	@_parametres <type_de_donnees>
AS
BEGIN
	SET NOCOUNT ON
	SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
 
	BEGIN TRY
		BEGIN TRANSACTION
 
		...
 
		COMMIT TRANSACTION
	END TRY
	BEGIN CATCH
		...
		ROLLBACK TRANSACTION
	END CATCH
END
Quel est le but de la manœuvre ?

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2011, 16h19   #3
Candidat au titre de Membre du Club
 
Inscription : septembre 2002
Messages : 26
Détails du profil
Informations forums :
Inscription : septembre 2002
Messages : 26
Points : 13
Points : 13
Le but de la manœuvre est de corriger un dysfonctionnement ... Il semble qu'elle est appelée une deuxième fois avant la fin de l'exécution précédente, et comme elle utilise des tables intermédiaires de calcul ça ne se passe pas bien !

Merci pour la réponse, j'essaie tout de suite !
florent_g est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2011, 18h40   #4
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 669
Points : 8 729
Points : 8 729
Citation:
Il semble qu'elle est appelée une deuxième fois avant la fin de l'exécution précédente
Dans ce cas il faudrait savoir pourquoi elle s'exécute une seconde fois.
Est-elle appelée par un job ?

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 08h56   #5
Candidat au titre de Membre du Club
 
Inscription : septembre 2002
Messages : 26
Détails du profil
Informations forums :
Inscription : septembre 2002
Messages : 26
Points : 13
Points : 13
Elle appelé par un écran utilisateur (bouton), comme il y a plusieurs écrans il peut y avoir des appels concurrents
florent_g est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 09h37   #6
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
Le but de la manœuvre est de corriger un dysfonctionnement ... Il semble qu'elle est appelée une deuxième fois avant la fin de l'exécution précédente, et comme elle utilise des tables intermédiaires de calcul ça ne se passe pas bien !

Merci pour la réponse, j'essaie tout de suite !
Vous pouvez aussi penser à 'isoler' votre traitement en ajoutant une colonne alimentée par un UNIQUEIDENTIFIER propre à votre exécution... ainsi même si elle est appelée une deuxième fois les exécution sont indépendantes.
Mais peut'être n'est ce pas le but recherché?
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 14h43   #7
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 723
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 723
Points : 6 844
Points : 6 844
Je me pose la question de savoir si le niveau de transaction SERIALIZABLE est vraiment adapté pour cette problématique. En effet même si ce mode permettra de bloquer l'exécution de 2 procédures simultanées elle n'empêchera pas pour autant son exécution. De plus le verrouillage fort qu'implique ce niveau d'isolation peut être pénalisant pour les autres requêtes qui seraient suceptibles d'utiliser les objets impliqués.

Il me semble que Hmira avait proposé une solution intéressante sur le sujet qui consistait à créer une table de réservation des procédures qui permettaient de fonctionner à l'instar des mutex.

++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 15h46   #8
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
Je me pose la question de savoir si le niveau de transaction SERIALIZABLE est vraiment adapté pour cette problématique. En effet même si ce mode permettra de bloquer l'exécution de 2 procédures simultanées elle n'empêchera pas pour autant son exécution. De plus le verrouillage fort qu'implique ce niveau d'isolation peut être pénalisant pour les autres requêtes qui seraient suceptibles d'utiliser les objets impliqués.
D'ou ma question: que voulez vous faire: annuler l'execution de la même SP quand clele-ci est déjà en cours d'execution ou faire en sorte qu'en cas de 2 appels 'chevauchants' les appels soient placés en liste d'attente?
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 17h19   #9
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 669
Points : 8 729
Points : 8 729
Mikedavem, Iberserk,

Les questions que vous soulevez ont tout leur sens, cela dit :

Citation:
Envoyé par florent_g
Elle appelé par un écran utilisateur (bouton), comme il y a plusieurs écrans il peut y avoir des appels concurrents
Il ne revient jamais à personne de gérer le verrouillage : le moteur de bases de données d'un SGBDR sait faire cela bien mieux que quiconque.

Si l'on souhaite effectuer un groupe de transactions comme une seule transaction, il suffit de le faire explicitement.

En cela je suis d'accord avec vous : le niveau d'isolation SERIALIZABLE ne répond pas proprement à la problématique.

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h45.


 
 
 
 
Partenaires

Hébergement Web