2

SQLサーバーに接続し、テーブルに対して更新アクションを実行するWindowsアプリケーションを作成しています。

同じテーブルのデータを変更しているP2という名前の別のプログラムがすでにあります。したがって、テーブルはロックされています

アプリケーションからテーブルにアクセスしているときにエラーが発生します

プログラムが最初にテーブルがすでにロックされているかどうかをチェックし、テーブルがロックされていない場合はデータを更新する必要があるソリューションが必要です。テーブルがすでにロックされている場合は、しばらく待ってから操作を再試行する必要があります。

誰かが私にそれを提供できますか?

4

3 に答える 3

3

操作を実行する前に、何かがロックされているかどうかを確認することは決して良い考えではありません。チェックを実行した直後、および更新を実行する直前にロックを取得できるため、次のようになります。

if(noLockOnTheTable)
{
  // ... something else acquires the lock just at this point
  updateTable();
}

したがって、ロックをチェックしようとするのは無駄です。代わりに、先に進んでロックを取得し、すぐに更新を実行する必要があります。他の操作に時間がかかりすぎて、ユーザーを待たせたくないので、それを回避できます。その場合、「短いロック待機タイムアウト」を指定して、「後で再試行する」というメッセージをユーザーに提供できます。ユーザーは待つ必要はありません。

于 2012-07-18T08:01:39.157 に答える
2

次のことを試すことができます。

CREATE TABLE #lockTable
(
[spid] smallint
, [dbid] smallint
, [objid] int
, [indid] smallint
, [type] nchar(4)
, [resource] nchar(32)
, [mode] nvarchar(8)
, [status] nvarchar(5)
);

INSERT INTO #lockTable EXEC sp_lock;

SELECT * FROM #lockTable WHERE objeid = OBJECT_ID('mytable');

DROP TABLE #lockTable;
于 2012-07-18T07:48:46.417 に答える
0

たとえば、現在のセッションでロックを取得します。

create table dbo.test (i int)
Go    

begin tran
insert into dbo.test With (tablock) (i) values (1)
Go
Select 
    DB_NAME(tl.resource_database_id) database_name, 
    tl.resource_type, 
    case when resource_type = 'OBJECT' then OBJECT_NAME(tl.resource_associated_entity_id) Else null End ObjectName, 
    tl.resource_type, 
    tl.request_mode,
    tl.request_status,
    tl.* 
From sys.dm_tran_locks tl
Where request_session_id = @@SPID 
order by case when resource_type = 'OBJECT' then OBJECT_NAME(tl.resource_associated_entity_id) Else null End,
    tl.request_mode, tl.resource_type
Rollback
于 2012-07-18T08:05:16.583 に答える