Wie lange sollte SET nehmen READ_COMMITTED_SNAPSHOT ON?
-
04-07-2019 - |
Frage
Wie lange sollte es dauern, laufen
ALTER DATABASE [MySite] SET READ_COMMITTED_SNAPSHOT ON
Ich lief es einfach und es wird 10 Minuten genommen.
Wie kann ich überprüfen, ob es angewendet wird?
Lösung
Sie können den Status der READ_COMMITTED_SNAPSHOT Einstellung mit der sys.databases
Ansicht. Überprüfen Sie den Wert des is_read_committed_snapshot_on
Spalte. Bereits gestellt und beantwortet .
Wie für die Dauer, Bücher Online-Dokumentation besagt, dass es keine andere Verbindungen zur Datenbank sein kann, wenn dies geschieht, aber es erfordert keinen Single-User-Modus. So können Sie von anderen aktiven Verbindungen blockiert werden. Run sp_who
(oder sp_who2
), um zu sehen, was sonst noch zu dieser Datenbank verbunden ist.
Andere Tipps
Versuchen Sie folgendes:
ALTER DATABASE generic SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE
OK (ich bin die ursprünglichen Fragesteller), so stellt ich die ganze Zeit aus habe ich nicht einmal das verflixte Ding aktiviert habe.
Hier ist der ultimative Code laufen Snapshot-Modus aktivieren und stellen sie sicher, dass es aktiviert ist.
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'
Dies funktioniert auch mit Verbindungen aktiv (vermutlich sind Sie gut mit ihnen hinausgeworfen zu werden).
Sie können die vor und nach Zustand und dies sollte fast sofort ausgeführt werden.
Wichtig:
Die Option READ_COMMITTED_SNAPSHOT entspricht oben IsolationLevel.ReadCommitted in .NET
Die Option ALLOW_SNAPSHOT_ISOLATION oben entspricht IsolationLevel.Snapshot in .NET
Großer Artikel über die verschiedenen Versions
.NET Tipps:
Sieht aus wie Isolationlevel.ReadCommitted
in Code erlaubt ist, auch wenn sie nicht von der Datenbank aktiviert. Keine Warnung ausgelöst. Also tun Sie sich einen Gefallen und sicherzustellen, dass es eingeschaltet ist, bevor Sie annehmen, dass es für 3 Jahre ist, wie ich !!! tat
Wenn Sie C # verwenden möchten Sie wahrscheinlich die ReadCommitted
Isolation und nicht Snapshot
- es sei denn, Sie schreibt in dieser Transaktion tun
READ COMMITTED SNAPSHOT
tut optimistisch liest und schreibt pessimistisch. Im Gegensatz dazu hat SNAPSHOT
optimistisch liest und optimistisch schreibt. (von hier)
bool snapshotEnabled = true;
using (var t = new TransactionScope(TransactionScopeOption.Required,
new TransactionOptions
{
IsolationLevel = IsolationLevel.ReadCommitted
}))
{
using (var shipDB = new ShipperDBDataContext())
{
}
}
In weiteren können Sie einen Fehler zu ‚nicht in der Lage zu fördern‘ eine Transaktion zu sein. Suche nach 'Förderung' in Einführung System.Transactions in .NET Framework 2.0 .
Wenn Sie nicht gerade etwas Besonderes wie eine Verbindung zu einer externen Datenbank (oder zweite Datenbank) dann etwas so Einfaches wie die Schaffung eines neuen Datacontext tun kann dies verursachen. Ich hatte einen Cache, dass ‚hochgefahren‘ seine eigene Datacontext bei der Initialisierung und dies wurde versucht, die Transaktion zu einem vollständigen verteilte man eskalieren.
Die Lösung war einfach:
using (var tran = new TransactionScope(TransactionScopeOption.Suppress))
{
using (var shipDB = new ShipperDBDataContext())
{
// initialize cache
}
}
Siehe auch Deadlocked
Artikel von @CodingHorror
Versuchen Sie diesen Code ein:
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
Ich habe versucht, den Befehl:
ALTER DATABASE MyDB SET READ_COMMITTED_SNAPSHOT ON
GO
gegen eine Dev-Box, aber das dauerte es 10+ Minuten und ich es so getötet.
Ich fand dann das:
https://willwarren.com/2015/10 / 12 / sQL-Server-read-committed-snapshot /
und nutzte seinen Code-Block (die etwa 1.26 nahm zu laufen):
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 '
Versuchen use master-Datenbank vor der aktuellen Datenbank zu ändern.
USE Master
GO
ALTER DATABASE [YourDatabase] SET READ_COMMITTED_SNAPSHOT ON
GO
Ich habe keine Sekunde für mich nehmen, wenn ich meine DB auf einzelne Benutzer geändert
Versuchen Sie, die anderen SQL-Dienste, so dass nur der SQL-Server-Dienst ausgeführt werden absperren.
-Mine lief für 5 Minuten dann habe ich es abgebrochen, weil es offensichtlich war nichts geschieht. Es ist ein brandneuer Server, so gibt es keine anderen Benutzer verbunden. Ich schließe die SQL Reporting Services aus und dann wieder lief .. dauerte weniger als eine Sekunde zu vervollständigen.