2011-02-15 3 views
0

Cette sutiation peut être facilement reproduite dans votre environnement de test. Ouvrez SSMS et connectez-vous à votre serveur. Ouvrir l'onglet Nouvelle requête connecté à la base de données MYTEST (je suppose que MYTEST est en ligne). Ne faites rien avec cet onglet. Ouvrir un nouvel onglet connecté à la même base de données. Tapez le code suivant dans votre nouvel ongletBlocage dans l'onglet SSMS

USE master 
GO 
ALTER DATABASE MYTEST 
SET OFFLINE 

Votre code sera la tête bloquée par le processus que vous exécutez à partir de votre premier onglet. (S'il vous plaît voir le Moniteur d'activité). Pourquoi l'exécution est-elle bloquée même s'il n'y a aucune tâche accosiée avec le processus dans le premier onglet?

Répondre

2

Vous auriez besoin de dire SQL pour lancer chaque connexion à

ALTER DATABASE MYTEST 
SET OFFLINE 
WITH ROLLBACK IMMEDIATE 

Ceci est by design: une connexion à une base de données a partagé verrouillage DB, que ce soit l'exécution ou non.

AVEC <termination>::=

spécifie quand faire reculer les transactions incomplètes lorsque la base est la transition d'un état à un autre. Si la clause de terminaison est omise, l'instruction ALTER DATABASE attend indéfiniment s'il y a un verrou sur la base de données. Une seule clause de terminaison peut être spécifiée et elle suit les clauses SET.

Il suffit de lancer sp_lock (ou quelles que soient les nouvelles DMVs sont :-) et vous les verrez

+1

ROLLABCK doit être modifié pour éviter rollback message « syntaxe incorrecte ». –