Microsoft SQL Server
ファントムリード
サーチ…
前書き
データベースシステムでは、トランザクションの整合性が他のユーザーやシステムにどのように表示されるかが分離によって決定されるため、1つの操作で行われた変更がどのようにいつ他のユーザーに表示されるかを定義します。データベースにコミットされていないデータを取得すると、ファントム読み取りが行われることがあります。
備考
MSDNのさまざまなISOLATION LEVEL
を読むことができます
分離レベルは未定義です
サンプル・データベースにサンプル・テーブルを作成する
CREATE TABLE [dbo].[Table_1](
[Id] [int] IDENTITY(1,1) NOT NULL,
[title] [varchar](50) NULL,
CONSTRAINT [PK_Table_1] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
(データベース上の)最初のクエリエディタを開き、以下のコードを挿入して実行します( --rollbackに触れないでください )。この場合、DBに行を挿入しますが、変更をコミットしません 。
begin tran
INSERT INTO Table_1 values('Title 1')
SELECT * FROM [Test].[dbo].[Table_1]
--rollback
2番目のクエリエディタ(データベース上)を開き、以下のコードを挿入して実行します。
begin tran
set transaction isolation level READ UNCOMMITTED
SELECT * FROM [Test].[dbo].[Table_1]
2番目のエディタでは、新規に作成された行(コミットされていない行)を最初のトランザクションから見ることができます。最初のエディタでロールバックを実行します(ロールバックワードを選択して実行します)。
-- Rollback the first transaction
rollback
2番目のエディタでクエリを実行すると、2番目のトランザクションですべての行を取得するために、コミットされていないレコードも取得されます。
これは、分離レベルを
set transaction isolation level READ UNCOMMITTED
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow