Wie lange sollte es dauern, um zu laufen
ALTER DATABASE [MySite] SET READ_COMMITTED_SNAPSHOT ON
Ich habe es gerade ausgeführt und es hat 10 Minuten gedauert.
Wie kann ich überprüfen, ob es angewendet wird?
sql-server
isolation-level
read-committed-snapshot
Simon_Weaver
quelle
quelle
Antworten:
Sie können den Status der Einstellung READ_COMMITTED_SNAPSHOT in der
sys.databases
Ansicht überprüfen . Überprüfen Sie den Wert deris_read_committed_snapshot_on
Spalte. Bereits gefragt und beantwortet .Bezüglich der Dauer gibt Books Online an, dass zu diesem Zeitpunkt keine weiteren Verbindungen zur Datenbank bestehen können, jedoch kein Einzelbenutzermodus erforderlich ist. Sie können also durch andere aktive Verbindungen blockiert werden. Führen Sie
sp_who
(odersp_who2
) aus, um zu sehen, was noch mit dieser Datenbank verbunden ist.quelle
Versuche dies:
ALTER DATABASE generic SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE
quelle
OK (ich bin der ursprüngliche Fragesteller), also stellte sich heraus, dass ich die ganze Zeit nicht einmal das verdammte Ding aktiviert hatte.
Hier ist der ultimative Code , der ausgeführt werden muss, um den Snapshot-Modus zu aktivieren und sicherzustellen, dass er 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 bei aktiven Verbindungen (vermutlich ist es in Ordnung, wenn sie rausgeschmissen werden).
Sie können den Vorher- und Nachher-Status sehen und dieser sollte fast sofort ausgeführt werden.
WICHTIG:
Die obige Option READ_COMMITTED_SNAPSHOT entspricht IsolationLevel.ReadCommitted in .NET.
Die obige Option ALLOW_SNAPSHOT_ISOLATION entspricht IsolationLevel.Snapshot in .NET
Toller Artikel über verschiedene Versionen
.NET-Tipps:
Sieht so aus,
Isolationlevel.ReadCommitted
als wäre Code zulässig, auch wenn er nicht von der Datenbank aktiviert wurde. Es wird keine Warnung ausgegeben. Tun Sie sich selbst einen Gefallen und stellen Sie sicher, dass es eingeschaltet ist, bevor Sie davon ausgehen, dass es 3 Jahre lang so ist wie ich !!!Wenn Sie C # verwenden, möchten Sie wahrscheinlich die
ReadCommitted
IsolationLevel und nichtSnapshot
- es sei denn, Sie schreiben in dieser Transaktion.READ COMMITTED SNAPSHOT
liest optimistisch und schreibt pessimistisch. Im Gegensatz dazu werdenSNAPSHOT
optimistische Lesevorgänge und optimistische Schreibvorgänge ausgeführt. (von hier)Außerdem wird möglicherweise die Fehlermeldung angezeigt, dass eine Transaktion nicht beworben werden kann. Suchen Sie unter Einführung in System.Transactions in .NET Framework 2.0 nach "Promotion" .
Wenn Sie nichts Besonderes tun, z. B. eine Verbindung zu einer externen Datenbank (oder einer zweiten Datenbank) herstellen, kann dies durch etwas so Einfaches wie das Erstellen eines neuen DataContext verursacht werden. Ich hatte einen Cache, der bei der Initialisierung seinen eigenen Datenkontext "hochfuhr", und dies versuchte, die Transaktion zu einer vollständig verteilten Transaktion zu 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 @CodingHorrorquelle
READ_COMMITTED_SNAPSHOT
unabhängig von einschaltenALLOW_SNAPSHOT_ISOLATION
. Sie könnenALLOW_SNAPSHOT_ISOLATION
ausschalten und trotzdem davon profitierenREAD_COMMITTED_SNAPSHOT
, eingeschaltet zu sein . Getestet: Microsoft SQL Server 2012 - 11.0.2100.60Versuchen Sie diesen Code:
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
quelle
Ich habe den Befehl ausprobiert:
ALTER DATABASE MyDB SET READ_COMMITTED_SNAPSHOT ON GO
gegen eine Entwickler-Box, aber es dauerte mehr als 10 Minuten und so habe ich es getötet.
Ich habe dann folgendes gefunden:
https://willwarren.com/2015/10/12/sql-server-read-committed-snapshot/
und benutzte seinen Codeblock (der ungefähr 1:26 dauerte):
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 '
quelle
Versuchen Sie, die Master-Datenbank zu verwenden, bevor Sie die aktuelle Datenbank ändern.
USE Master GO ALTER DATABASE [YourDatabase] SET READ_COMMITTED_SNAPSHOT ON GO
quelle
Ich habe keine Sekunde für mich gebraucht, als ich meine Datenbank auf Einzelbenutzer umgestellt habe
quelle
Versuchen Sie, die anderen SQL-Dienste auszuschalten, damit nur der SQL Server-Dienst ausgeführt wird.
Meins lief 5 Minuten, dann habe ich es abgesagt, weil es offensichtlich war, dass nichts passierte. Es ist ein brandneuer Server, sodass keine anderen Benutzer verbunden sind. Ich habe die SQL Reporting Services heruntergefahren und dann erneut ausgeführt. Die Fertigstellung dauerte weniger als eine Sekunde.
quelle