2009-04-13 9 views
1

を試みる前に、私は、SQL Serverデータベースをアップグレードするためのいくつかのコードを書いています。私は、データベースをアップグレードする前に、私は経由して排他ロックを達成:テスト排他ロック

ALTER DATABASE Test SET SINGLE_USER WITH NO_WAIT 

しかし、私は排他ロックが、私は上記のコードを実行前可能であるかどうかを確認するために、データベースをテストしたいと思います。テストでは、私は排他ロックを獲得しようとすると、タイムアウトの可能性を回避したいのですが、100%完璧である必要はありません。

そのために、私は以下のコード書いている:私は、1つの以上の行が返された場合は、データベースが使用中でなければならないと仮定してい

SELECT 
    * 
FROM 
    sys.db_tran_locks 
WHERE 
    resource_database_id = DB_ID('Test') AND 
    request_session_id <> @@SPID 

を。これは本当ですか?それとも簡単じゃないの?アカウントにGBNのコメント@取ると、私は次のステートメントを使用して、既存の接続のロールバックを強制することに決めました

UPDATE

ALTER DATABASE Test SET SINGLE_USER WITH ROLLBACK IMMEDIATE 

このコードを実行する前に、私は、ユーザーに機会を与えるでしょうオプトアウトする。しかし、私は、ユーザーがデータベースにアクティブな接続の一覧を見ることができるようにしたいのですが - ので、情報に基づいた意思決定を行うことができます。それは私をこの質問に導く。

答えて

2

主に、DBロックはそれが使用中であることを示すことです。データベースは、コード/テーブルオブジェクトに比べて多くの排他的ロック状況を持っていません。

シングルユーザーモードでは、ロックではなく、接続数が許可されます。

チェックとALTER DBの間で状態が変化しないという保証はないので、私はTRY/CATCHブロックにALTER DATABASEをラップします。

しかし、私は間違っているか間違っている可能性があるので、上のクエリのデータベースリソースで排他ロックモードをテストする必要があります。

:あなたのコードは、上記のあなたにこれらのことで、それを使用しているあなたは検出することができますコメント

をもとに、誰かSSMSで開いて空白のクエリウィンドウを持つかもしれない任意のロック、...

編集し、表示されます

  • sys.dm_exec_connection S
  • sys.dm_exec_sessions
  • sys.dm_exec_requests

正直に言うと、それは、自動統計の更新または単一の接続を取って、ユーザーを停止することは困難です。通常、これは他のすべてのユーザーを切断し、待たずに待つことを意味します。

ALTER DATABASE MYDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
+0

その場合、私がやろうとしていることは、データベースを1つの接続に減らすことができるかどうかを判断することです。現在の接続のセットを照会する方法はありますか? – Mitkins

0

排他ロックを取得しようとするまで、使用していないと判断した時点からデータベースがビジー状態になる場合はどうなりますか?

+0

もちろん、これをやめることは何もありません。ただし、アップグレードプロセスの一部は、ユーザーがデータベースへの接続を削除することです。だからうまくいけば、データベースがビジーではない可能性が高くなります。 – Mitkins

関連する問題