2

私のテストテーブル:

CREATE TABLE [dbo].[Personel](
    [PersonelID] [int] NOT NULL,
    [Name] [nchar](10) NULL,
 CONSTRAINT [PK_Personel] PRIMARY KEY CLUSTERED 
(
    [PersonelID] ASC
)
)

私のテストデータ:

insert into Personel
values (1, 'Jack')
, (2, 'John')
, (3, 'Kevin')

接続A:

begin tran
update Personel
set Name = 'Michael'
where PersonelID = 1

接続B:

SET TRANSACTION ISOLATION LEVEL ????

SELECT Name 
FROM Personel WITH (????)
where PersonelID = 1

接続Aはトランザクションを開始し、データを更新しようとしていますが、トランザクションはまだ進行中です。接続Bは、更新中のデータを読み取ろうとします。

トランザクションがコミットまたはロールバックされる前に、元のデータ(MichaelではなくJack)を確認する方法(分離レベルまたはこれら2つのヒントまたは組み合わせ)はありますか?

4

2 に答える 2

2

SNAPSHOT (別名、行のバージョン管理)。

スナップショット分離では、接続 B は、ti が接続 B でトランザクションを開始したときのデータをそのまま表示します (明示的なトランザクションを開始していなくても、SELECT ステートメントによって開始された暗黙のトランザクションがあります)。行のバージョン管理に基づく分離レベルについてを参照してください。

スナップショット トランザクションによって実行される読み取り操作は、スナップショット トランザクションの開始時にコミットされた各行の最後のバージョンを取得します。

SNAPSHOT サポートは、データベースで明示的に有効にする必要があります。

ALTER DATABASE <DatabaseName> SET ALLOW_SNAPSHOT_ISOLATION ON;
于 2012-07-18T09:45:41.463 に答える
2

SNAPSHOT 分離レベルで古いバージョンのデータにアクセスできます。

これには、開始する前にデータベースでスナップショット分離が有効になっている必要があります。

ALTER DATABASE <dbname> SET ALLOW_SNAPSHOT_ISOLATION ON

次に、接続 B で

SET TRANSACTION ISOLATION LEVEL SNAPSHOT

select * from Personel

スナップショット分離では、tempdb に読み取られる行が複製されるため、パフォーマンスに関する考慮事項がいくつかあります。

ドキュメント参照

于 2012-07-18T09:46:19.507 に答える