実行にかかる時間
ALTER DATABASE [MySite] SET READ_COMMITTED_SNAPSHOT ON
ちょうどそれを走らせて、それは10分かかりました。
適用されているかどうかを確認するにはどうすればよいですか?
sys.databases
ビューを使用して、READ_COMMITTED_SNAPSHOT設定のステータスを確認できます。 is_read_committed_snapshot_on
列の値を確認します。すでに 質問と回答 。
期間については、Books Onlineでは、これが行われたときにデータベースへの他の接続はできないと述べていますが、シングルユーザーモードは必要ありません。そのため、他のアクティブな接続によってブロックされる可能性があります。実行sp_who
(またはsp_who2
)他にそのデータベースに接続されているものを確認します。
これを試して:
ALTER DATABASE generic SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE
OK(私は最初の質問者です)なので、この間ずっと、私はくそったれを有効にしてさえいませんでした。
スナップショットモードを有効にし、有効にするために実行する ltimate code を次に示します。
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
ではなくSnapshot
IsolationLevelが必要です。
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
}
}
Deadlocked
@CodingHorrorによる記事 も参照してください。
このコードを試してください:
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
私はコマンドを試しました:
ALTER DATABASE MyDB SET READ_COMMITTED_SNAPSHOT ON
GO
開発ボックスに対してですが、それは10分以上かかりましたので、私はそれを殺しました。
それから私はこれを見つけました:
https://willwarren.com/2015/10/12/sql-server-read-committed-snapshot/
そして、彼のコードブロックを使用しました(実行に約1:26かかりました)。
USE master
GO
/**
* Cut off live connections
* This will roll back any open transactions after 30 seconds and
* restricts access to the DB to logins with sysadmin, dbcreator or
* db_owner roles
*/
ALTER DATABASE MyDB SET RESTRICTED_USER WITH ROLLBACK AFTER 30 SECONDS
GO
-- Enable RCSI for MyDB
ALTER DATABASE MyDB SET READ_COMMITTED_SNAPSHOT ON
GO
-- Allow connections to be established once again
ALTER DATABASE MyDB SET MULTI_USER
GO
-- Check the status afterwards to make sure it worked
SELECT is_read_committed_snapshot_on
FROM sys.databases
WHERE [name] = 'MyDB '
現在のデータベースを変更する前に、マスターデータベースを使用してみてください。
USE Master
GO
ALTER DATABASE [YourDatabase] SET READ_COMMITTED_SNAPSHOT ON
GO
DBをシングルユーザーに変更したとき、1秒もかかりませんでした
SQLサーバーサービスのみが実行されるように、他のSQLサービスをシャットオフしてください。
私は5分間走りましたが、何も起きていないのは明らかだったのでキャンセルしました。その新しいサーバーなので、他のユーザーは接続されていません。 SQL Reporting Servicesを停止してから再度実行しました。完了までに1秒もかかりませんでした。