[SQL] 修正データへの 共有アクセス

サポートが終了した KB の内容についての免責事項

この記事は、マイクロソフトがサポートを提供しなくなった製品について記述しています。 したがって、この記事は「現状のまま」で提供され、更新されることはありません。

概要

J.N. Gray (下記を参照) の一貫性レベル 2 (「ダーティ」データへのアクセスの制限) を維持する必要がある場合は、あるユーザーがテーブルの変更を行っているときに、ほかのユーザーはこの未確定の変更を読み出すことを許可されません。SQL Server がサポートしているロッキングの最小単位はページであるため、更新内容がコミットされていないページはほかのユーザーからは読み出せません。ロックされているページが多いと、SQL Server は、効率を考えて、テーブル全体をロックする場合があります。


SAVE TRANSACTION を実行してもコミットは行われません。これは中間のロールバック点になります。どのような場合でも、ダーティ データは、コミットされるまで、ほかのユーザーからはアクセスすることができません。

詳細

J.N. Gray の『Granularity of Locks and Degrees of Consistency in a Shared DataBase』 (1979) には、一貫性のレベルとして次の4つが紹介されています。
  1. レベル 0 ―コミットされていない (ダーティ) データに対する更新が許可されます。

    このレベルでは、仮に更新された内容をほかのユーザーがもう一度更新し、最初に更新したユーザーがアボートやロールバックを行うと、二番目のユーザーが行った更新は失われてしまうため、データの一貫性が損なわれる可能性があります。
  2. レベル 1 ―コミットされていない更新をさらに更新することは禁止されますが、読み出すことは許可されます。このレベルでは、まだコミットされていないデータに対してなんらかの決定(たとえば、ロールバック) が行われる可能性があります。
  3. レベル 2 ―コミットされていない更新を読み出すことは禁止されます。これは、SQLServer が提供する一貫性の、最も低いレベルに相当します。状況によっては、コミットされていない更新を読み出したい場合がありますが、現時点の SQL Server には、そのためのオプションが用意されていません。SQL Server では、作業の論理単位 (LUW) が持続している間、更新されたすべてのページに対して「排他的」ロックを保持することにより、このレベルの一貫性を実現しています。BEGIN TRAN が使われていない場合は、ロックは、そのロックを引き起こした SQL ステートメントが持続している間保持されます。BEGIN TRAN を使っている場合は、ロックは COMMIT TRAN が実行されるまで保持されます。
  4. レベル 3 ―特定のユーザーが読み出しているデータをほかのユーザーが更新することは、その特定ユーザーがコミットするまで禁止されます。これにより、ユーザーは、トランザクションが持続している間、データを元のイメージのまま「参照」することができます。ほかのユーザーは、データを読み出すことはできますが、更新することはできません。SQL Server では、HOLDLOCK オプション付きで読み出されているテーブル中のすべてのページに対して、トランザクションがコミットするまで「共有ロック」を保持することにより、このレベルの一貫性を実現しています。 レベル 2 と同様に、更新されたページには排他的ロックが掛けられます。ロックは、レベル 2 の場合とまったく同様に、LUW が終了した時点で解除されます。


プロパティ

文書番号:45542 - 最終更新日: 2003/08/27 - リビジョン: 1

フィードバック