1

行が更新のために既にロックされている場合、NoWait でコミットされたデータを SQL Server で読み取ることは可能ですか?

「Tbl」という名前のテーブルを作成しました

CREATE TABLE [dbo].[Tbl](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Detail] [varchar](50) NULL)

いくつかの行を挿入しました。

insert into Tbl(Detail) values ('1D')
insert into Tbl(Detail) values ('2D')
insert into Tbl(Detail) values ('3D')
insert into Tbl(Detail) values ('4D')

これで、SSMS で暗黙のトランザクションを true に設定しました。(ツール -> オプション -> SQL Server -> ANSI.

次に、1 つのセッション (Opened New Query Window) で update ステートメントを実行し、行に排他ロックを設定する必要があります。

UPDATE dbo.tbl  SET Detail = '9D' where Id = 1

さて、別のセッションで、コミットされた行を選択したいと思います。私が実行すると、

SELECT * FROM dbo.tbl with(READCOMMITTED,NOWAIT)、例外をスローします(Lock Request Timeout Period Exceed)

別のセッションが既に排他ロックを適用している行に共有ロックを適用しようとしている可能性があります。したがって、例外が発生します。

さて、これは 1 つのトランザクションが巨大な行を更新するのに長い時間がかかる一般的なシナリオです。待たずに別のセッションでコミットされたデータを見ることができるはずです。

SQL Server でこれを実現するには、どのような種類の HINT が必要ですか?

4

2 に答える 2

8

SNAPSHOTこれは、分離 (または read-committed-snapshot モード) の形式でのみ使用できます。最初にデータベースで有効にする必要があります。

トランザクションをSNAPSHOT分離して実行するということは、ロックを取得したり待機したりしないことを意味します。tran は、データベースの特定時点のスナップショットを確認します。

于 2013-07-03T20:09:09.483 に答える