84

実行にかかる時間

ALTER DATABASE [MySite] SET READ_COMMITTED_SNAPSHOT ON

実行したところ、10分かかりました。

適用されているかどうかはどうやって確認できますか?

4

9 に答える 9

72

ビューを使用して READ_COMMITTED_SNAPSHOT 設定のステータスを確認できsys.databasesます。is_read_committed_snapshot_on列の値を確認してください。すでに質問され、回答されています。

期間に関しては、Books Online は、これが行われている場合、データベースへの他の接続は存在できないと述べていますが、シングル ユーザー モードは必要ありません。そのため、他のアクティブな接続によってブロックされる可能性があります。sp_who(または) を実行sp_who2して、そのデータベースに他に何が接続されているかを確認します。

于 2008-10-24T03:04:58.213 に答える
56

これを試して:

ALTER DATABASE generic SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE
于 2009-08-10T06:50:53.503 に答える
33

わかりました(私は最初の質問者です)、この間ずっと、くそったれを有効にしていなかったことがわかりました。

スナップショット モードを有効にし、有効になっていることを確認するために実行する最終的なコードを次に示します。

SELECT is_read_committed_snapshot_on, snapshot_isolation_state_desc,snapshot_isolation_state FROM sys.databases WHERE name='shipperdb'

ALTER DATABASE shipperdb SET allow_snapshot_isolation ON
ALTER DATABASE shipperdb SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE shipperdb SET read_committed_snapshot ON
ALTER DATABASE shipperdb SET MULTI_USER

SELECT is_read_committed_snapshot_on, snapshot_isolation_state_desc,snapshot_isolation_state FROM sys.databases WHERE name='shipperdb'

これは、接続がアクティブであっても機能します (おそらく、それらが追い出されても問題ありません)。

前後の状態を見ることができ、これはほとんどすぐに実行されるはずです。


重要:

上記のオプション READ_COMMITTED_SNAPSHOT は、.NET の IsolationLevel.ReadCommitted に対応します
上記のオプション ALLOW_SNAPSHOT_ISOLATION は、.NET の IsolationLevel.Snapshot に対応します

異なるバージョン管理に関する素晴らしい記事


.NET のヒント:

Isolationlevel.ReadCommittedデータベースで有効になっていない場合でも、コードで許可されているようです。警告はスローされません。ですから、私のように 3 年間だと思い込む前に、電源が入っていることを確認してください!!!

C# を使用している場合は、おそらくReadCommittedIsolationLevelSnapshotが必要ですが、このトランザクションで書き込みを行っている場合を除きます。

READ COMMITTED SNAPSHOT楽観的な読み取りと悲観的な書き込みを行います。対照的に、SNAPSHOT楽観的な読み取りと楽観的な書き込みは行います。(ここから)

bool snapshotEnabled = true;

using (var t = new TransactionScope(TransactionScopeOption.Required,
               new TransactionOptions
{
     IsolationLevel = IsolationLevel.ReadCommitted
}))
{
     using (var shipDB = new ShipperDBDataContext())
     {

     }
}

さらに、トランザクションを「昇格できません」というエラーが表示される場合があります。「 .NET Framework 2.0 での System.Transactions の紹介」で「プロモーション」を検索してください。

外部データベース (または 2 番目のデータベース) への接続などの特別なことを行っていない限り、新しい DataContext を作成するなどの単純な操作でこれが発生する可能性があります。初期化時に独自のデータコンテキストを「スピンアップ」するキャッシュがあり、これはトランザクションを完全な分散トランザクションにエスカレートしようとしていました。

解決策は簡単でした:

        using (var tran = new TransactionScope(TransactionScopeOption.Suppress))
        {
            using (var shipDB = new ShipperDBDataContext())
            { 
                 // initialize cache
            }
        }

@CodingHorror の記事も参照してくださいDeadlocked

于 2012-12-05T20:36:41.907 に答える
9

このコードを試してください:

if(charindex('Microsoft SQL Server 2005',@@version) > 0)
begin
    declare @sql varchar(8000)
    select @sql = '
    ALTER DATABASE ' + DB_NAME() + ' SET SINGLE_USER WITH ROLLBACK IMMEDIATE ;
    ALTER DATABASE ' + DB_NAME() + ' SET READ_COMMITTED_SNAPSHOT ON;
    ALTER DATABASE ' + DB_NAME() + ' SET MULTI_USER;'

    Exec(@sql)
end
于 2010-01-13T16:26:13.387 に答える
3

現在のデータベースを変更する前に、master データベースを使用してみてください。

USE Master
GO

ALTER DATABASE [YourDatabase] SET READ_COMMITTED_SNAPSHOT ON
GO
于 2012-05-10T12:43:23.390 に答える
2

DBをシングルユーザーに変更したとき、私は1秒もかかりませんでした

于 2012-11-12T11:41:21.797 に答える