シナリオ:
ストアド プロシージャ (プロシージャ A) は、更新を実行するためにテーブル 'a' への排他的アクセスを必要とします。 SQL Server Reporting Services (SSRS) のレポートは、不整合を防ぐために、手順 A が完了した後にのみ「a」からのデータを表示する必要があります。
解決策:
これを保証する最も効果的な方法は、トランザクションと適切なロック ヒントを使用することです。
コード例:
<code class="language-sql">CREATE PROCEDURE ProcedureA AS BEGIN BEGIN TRANSACTION; -- Initiate a transaction SELECT ... FROM a WITH (XLOCK, HOLDLOCK); -- Exclusive lock (XLOCK) and hold the lock until the transaction ends (HOLDLOCK) WHERE ...; -- Perform operations not directly involving table 'a' here... -- Update table 'a' ... COMMIT TRANSACTION; -- Commit the transaction, releasing the lock END;</code>
説明:
BEGIN TRANSACTION;
: トランザクションを開始します。トランザクション内のすべての操作は、単一の作業単位として扱われます。SELECT ... FROM a WITH (XLOCK, HOLDLOCK);
: この SELECT
ステートメントは、重要なことに、XLOCK
ヒントを使用してテーブル 'a' の排他ロックを取得します。 HOLDLOCK
は、複数のステートメントにまたがる場合でも、トランザクションが完了するまでロックが保持されることを保証します。 これにより、プロシージャ A の実行中に他のプロセスが 'a' を読み書きすることができなくなります。-- Perform operations not directly involving table 'a' here...
: ここで他の操作を実行できます。-- Update table 'a' ...
: テーブル 'a' への更新はトランザクション内で実行されます。COMMIT TRANSACTION;
: トランザクションがコミットされ、変更が永続化され、テーブル 'a' の排他ロックが解放されます。 エラーが発生した場合は、ROLLBACK TRANSACTION;
を使用して変更を元に戻し、ロックを解放する必要があります。このアプローチでは、ストアド プロシージャの実行中にテーブルへの同時アクセスを防止することで、データの整合性を確保します。手順の完了後、SSRS レポートには更新されたデータが正確に反映されます。
以上がストアド プロシージャが完了するまで SQL Server テーブルがロックされたままになるようにするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。