2012-03-08 16 views
2

基本的には、テーブルが自分のコードからロックされているかどうかを確認する必要があります。SQL ServerのテーブルがSET LOCK_TIMEOUTでロックされているかどうかを調べる0

私はこれをDB上で直接実行するかどうかを知っています。

SELECT * FROM 'tablename' SET LOCK_TIMEOUT 0 

そうでない場合は、テーブルがロックされていないか、何もされている場合、私はすぐにエラーを得ることができます。しかし、私がこのステートメントを自分のコードから呼び出すと、ロックが解放されてから戻ってくるまでに一定の時間待つようです。このクエリを呼び出すために使用しているコードは次のとおりです。

SqlConnection conn = new SqlConnection(@"ConnectionString"); 
using(conn) 
{ 
    conn.Open(); 
    var query = new SqlCommand("SELECT * FROM tablename SET LOCK_TIMEOUT 0", conn); 

    try 
    { 
     SqlDataReader reader = query.ExecuteReader(); 
     // No lock 
    }catch (Exception) 
    { 
     // Deal with lock exception 
    } 
} 

私はすぐに知りたいです。助言がありますか?またはこれを行うためのより良い方法は?

答えて

2

あなたが前を設定する必要があるのに対し、後にSELECTそれはあなたが達成しようと、何の目的のためにしているもののゴールは明らかではないのですが、あなたはロック・タイムアウトを設定しています。あなたは、トランザクションのロックを意味する場合

+0

これは、トリック、アンクス – Boob

1

、この点を確認してください。

select 
    object_name(resource_associated_entity_id) as 'TableName' ,* 
from 
    sys.dm_tran_locks 
where resource_type = 'OBJECT' 
    and resource_database_id = DB_ID() 

この:テーブルは、任意のトランザクションによって、このような

1

たぶん何かをロックされていない場合、これは行を戻さないだろう

select 
    object_name(resource_associated_entity_id) as 'TableName' ,* 
from 
    sys.dm_tran_locks 
where resource_type = 'OBJECT' 
    and resource_database_id = DB_ID() and 
    object_name(resource_associated_entity_id) = N'YourTableName' 

今見ているテーブルのすべてのテーブルを取得します

関連する問題