Сколько времени должно занять SET READ_COMMITTED_SNAPSHOT ON? - PullRequest
68 голосов
/ 24 октября 2008

Сколько нужно времени, чтобы бежать

ALTER DATABASE [MySite] SET READ_COMMITTED_SNAPSHOT ON

Я просто запустил его, и это заняло 10 минут.

Как я могу проверить, применяется ли он?

Ответы [ 8 ]

63 голосов
/ 24 октября 2008

Вы можете проверить состояние настройки READ_COMMITTED_SNAPSHOT, используя представление sys.databases. Проверьте значение столбца is_read_committed_snapshot_on. Уже спросил и ответил .

Что касается продолжительности, Books Online заявляет, что при этом не может быть никаких других подключений к базе данных, но для этого не требуется однопользовательский режим. Таким образом, вы можете быть заблокированы другими активными подключениями. Запустите sp_who (или sp_who2), чтобы узнать, что еще подключено к этой базе данных.

44 голосов
/ 10 августа 2009

Попробуйте это:

ALTER DATABASE generic SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE
27 голосов
/ 06 декабря 2012

ОК (я первоначальный спрашивающий), так что получается, что все это время у меня даже не было проклятой вещи.

Вот конечный код , который нужно запустить, чтобы включить режим моментального снимка и убедиться, что он включен.

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, указанная выше, соответствует IsolationLevel.ReadCommitted в .NET
Опция ALLOW_SNAPSHOT_ISOLATION выше соответствует IsolationLevel.Snapshot в .NET

Отличная статья о различных версиях


.NET Советы:

Похоже, Isolationlevel.ReadCommitted разрешено в коде, даже если оно не включено базой данных. Предупреждение не выбрасывается. Так что сделайте себе одолжение и убедитесь, что он включен, прежде чем предположить, что он на 3 года, как я сделал!

Если вы используете C #, вам, вероятно, нужен ReadCommitted IsolationLevel, а не Snapshot - если вы не делаете записи в этой транзакции.

READ COMMITTED SNAPSHOT делает оптимистичные чтения и пессимистичные записи. Напротив, SNAPSHOT делает оптимистичные чтения и оптимистичные записи. (отсюда)

bool snapshotEnabled = true;

using (var t = new TransactionScope(TransactionScopeOption.Required,
               new TransactionOptions
{
     IsolationLevel = IsolationLevel.ReadCommitted
}))
{
     using (var shipDB = new ShipperDBDataContext())
     {

     }
}

Кроме того, вы можете получить сообщение об ошибке «невозможность продвижения» транзакции. Поиск «продвижения» в Представление System.Transaction в .NET Framework 2.0 .

Если вы не делаете что-то особенное, например, подключаетесь к внешней базе данных (или второй базе данных), это может быть вызвано чем-то таким простым, как создание нового DataContext. У меня был кеш, который «раскручивал» свой собственный текст данных при инициализации, и он пытался перевести транзакцию в полностью распределенную.

Решение было простым:

        using (var tran = new TransactionScope(TransactionScopeOption.Suppress))
        {
            using (var shipDB = new ShipperDBDataContext())
            { 
                 // initialize cache
            }
        }

См. Также Deadlocked статья @ CodingHorror

8 голосов
/ 13 января 2010

Попробуйте этот код:

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
4 голосов
/ 09 августа 2017

Я попробовал команду:

ALTER DATABASE MyDB SET READ_COMMITTED_SNAPSHOT ON
GO

против dev box, но прошло более 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 '
3 голосов
/ 10 мая 2012

Попробуйте использовать базу данных master перед изменением текущей базы данных.

USE Master
GO

ALTER DATABASE [YourDatabase] SET READ_COMMITTED_SNAPSHOT ON
GO
2 голосов
/ 12 ноября 2012

Мне не потребовалось ни секунды, чтобы сменить базу данных на однопользовательскую

0 голосов
/ 28 марта 2017

Попробуйте отключить другие службы SQL, чтобы работала только служба сервера SQL.

Моя побежала 5 минут, потом я отменил ее, потому что было очевидно, что ничего не происходит. Это новый сервер, так что другие пользователи не подключены. Я отключил службы отчетов SQL, а затем снова запустил его. Потребовалось менее секунды, чтобы завершить.

...