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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top