実行にかかる時間
ALTER DATABASE [MySite] SET READ_COMMITTED_SNAPSHOT ON
実行したところ、10分かかりました。
適用されているかどうかはどうやって確認できますか?
実行にかかる時間
ALTER DATABASE [MySite] SET READ_COMMITTED_SNAPSHOT ON
実行したところ、10分かかりました。
適用されているかどうかはどうやって確認できますか?
ビューを使用して READ_COMMITTED_SNAPSHOT 設定のステータスを確認できsys.databases
ます。is_read_committed_snapshot_on
列の値を確認してください。すでに質問され、回答されています。
期間に関しては、Books Online は、これが行われている場合、データベースへの他の接続は存在できないと述べていますが、シングル ユーザー モードは必要ありません。そのため、他のアクティブな接続によってブロックされる可能性があります。sp_who
(または) を実行sp_who2
して、そのデータベースに他に何が接続されているかを確認します。
これを試して:
ALTER DATABASE generic SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE
わかりました(私は最初の質問者です)、この間ずっと、くそったれを有効にしていなかったことがわかりました。
スナップショット モードを有効にし、有効になっていることを確認するために実行する最終的なコードを次に示します。
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# を使用している場合は、おそらくReadCommitted
IsolationLevelSnapshot
が必要ですが、このトランザクションで書き込みを行っている場合を除きます。
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
このコードを試してください:
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
現在のデータベースを変更する前に、master データベースを使用してみてください。
USE Master
GO
ALTER DATABASE [YourDatabase] SET READ_COMMITTED_SNAPSHOT ON
GO
DBをシングルユーザーに変更したとき、私は1秒もかかりませんでした