J'ai une table A (SQL Server 2008) qui contient des ensembles de nombres min et max. Dans l'une de mes procédures stockées, j'utilise cette table jointe à une table de produits B pour trouver un numéro de produit disponible compris entre min et max puis insérer un nouveau produit avec ce numéro de produit. Donc, je veux le prochain numéro gratuit qui est entre min/max. Entre la découverte du prochain numéro disponible et l'insertion de la ligne de produit, je veux un verrou pour empêcher quiconque de trouver le même nombre (et en donnant une copie).Comment verrouiller pour éviter les numéros en double
Comment devrais-je penser dans cette situation? Dois-je obtenir un verrou de mise à jour sur la table A même si je ne le modifie jamais? Le verrou doit être libéré après avoir fait l'insertion dans la table B et la transaction se termine? Cette fermeture de mise à jour empêchera-t-elle d'autres transactions de lire la table A?
Editer: La table min/max est une table pour différentes séries de produits. Selon la série que vous voulez, je veux essayer de trouver un numéro disponible dans cette séquence. Le productnr n'est pas unique, il serait possible de le rendre unique en combinaison avec une deuxième colonne. Simplifié sp:
CREATE PROCEDURE [dbo].[InsertProduct]
(
@Param1 int,
@Param2 bit,
...
@Param20 int) AS
BEGIN
DECLARE @ProductNr int
--Here I do a query to determine which ProductNr I should have. Checking that the number is between max/min in the series and that no other product has this productnr.
--Now insert the row
INSERT INTO Products VALUES (@Param1, @ProductNr, ...., @Param2
END
Ce serait probablement le meilleur moyen. Je ne peux pas avoir une contrainte unique sur la colonne nombre car elle peut contenir des valeurs nulles et sql server n'autorise pas une contrainte unique avec plusieurs valeurs nulles pour autant que je sache. – KTrum
@KTrum - Vous pouvez créer une contrainte unique filtrée pour avoir la vérification unique tout en autorisant les valeurs nulles. 'create unique index Nom sur Tbl1 (Field asc) où (Field n'est pas nul)' –