J'ai une grande table remplie à partir d'une vue. Ceci est fait parce que la vue prend beaucoup de temps à s'exécuter et qu'il est plus facile d'avoir les données facilement disponibles dans une table. Une procédure est exécutée de temps en temps pour mettre à jour la table.Verrouiller la table lors de l'insertion
TRUNCATE TABLE LargeTable
INSERT INTO LargeTable
SELECT *
FROM viewLargeView
WITH (HOLDLOCK)
Je voudrais verrouiller ce tableau lors de l'insertion donc si quelqu'un essaie de sélectionner un enregistrement, ils ne recevront pas rien après la troncature. Le verrou que j'utilise semble bloquer la vue et non la table.
Existe-t-il une meilleure façon d'aborder ce problème?
Qu'en est-il de l'ouverture d'une transaction avant l'insertion et de la fermeture après? –
Lors de l'ouverture d'une transaction, un autre utilisateur peut-il effectuer une sélection dans la table? – JBone
FYI, je vous recommande d'utiliser DELETE au lieu de TRUNCATE, comme TRUNCATE est un DDL, au lieu d'un DML comme DELETE, et nécessite donc de plus grandes autorisations. De plus, si vous encapsulez ceci dans une Transaction (qui est la réponse correcte à votre question), ils effectueront effectivement la même chose. – RBarryYoung