Сколько времени должно занять SET READ_COMMITTED_SNAPSHOT ON?

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

ALTER DATABASE [MySite] SET READ_COMMITTED_SNAPSHOT ON

Я только что запустил и это заняло 10 минут.

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

ой. не был включен все это время !! (серьезно!) Это объясняет тупиковые ситуации. см. мой ответ ниже для полных выводов и лучшего сценария для запуска

Simon_Weaver 06.12.2012 00:37

Само действие завершается почти мгновенно. Причина, по которой он не вернется, заключается в том, что он ждет, пока другие пользователи выйдут из базы данных. Это не значит, что он занят мышлением, взбалтыванием, потреблением ресурсов; он ждет, когда все выйдут из комнаты, поэтому щелкает переключателем.

Ian Boyd 29.07.2019 17:30
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
81
2
89 907
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Ответ принят как подходящий

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

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

благодаря. Это заняло 40 минут и показывает 0. Это база данных 740 МБ. скрестив пальцы, я не сломал это

Simon_Weaver 24.10.2008 07:16

Попробуйте открыть другое окно запроса к этой базе данных. Если можете, то я полагаю, что ваш оператор еще не запущен.

Rick 24.10.2008 07:30

Ага. В большинстве баз данных это займет всего несколько секунд. Если требуется больше времени, он ожидает завершения другого (даже неактивного) соединения, прежде чем он сможет внести изменения. Таким образом, вам может потребоваться найти и УБИТЬ все подключенные в данный момент spids (после оценки того, что они делают). ТОГДА это должно пройти быстро.

Michael K. Campbell 09.09.2011 21:09

Я рекомендую использовать опцию NO_WAIT для немедленного отказа, если есть другие открытые соединения. Например. 'ALTER DATABASE generic SET READ_COMMITTED_SNAPSHOT ON WITH NO_WAIT'

StefanR 20.09.2012 17:37

Если вы не можете найти и уничтожить другие подключенные SPID (или вам просто все равно), вы всегда можете просто перезапустить экземпляр SQL Server.

David Murdoch 10.10.2013 20:23

Меня заблокировал spid11, который в моем случае является серверным процессом CHECKPOINT. Запуск sp_who показал мой блок при завершении контрольной точки.

Ian Boyd 15.02.2014 03:01

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

ALTER DATABASE generic SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE

Так в чем же польза от "С НЕМЕДЛЕННЫМ ОТКАТОМ"? Означает ли это, что он автоматически откатится, если запрос не удастся?

Senior Systems Engineer 12.06.2012 04:15

Нет, «WITH ROLLBACK IMMEDIATE» означает, что он немедленно откатит все открытые транзакции перед запуском оператора ALTER DATABASE. Я бы не советовал этого делать, если вы еще не проверили, какие транзакции открыты и можно ли их безопасно откатить.

Rick 12.07.2012 16:35

Потрясающе, также сообщает о прогрессе закрытия соединений. Вы спасли наш бекон!

Tyeth 26.04.2019 13:05

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

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

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

Rick 11.01.2012 21:20

вам также нужно "SET allow_snapshot_isolation ON", верно? (см. мой ответ)

Simon_Weaver 06.12.2012 00:38

Документы mssql утверждают, что вам действительно нужно установить разрешающую изоляцию моментальных снимков. Но я действительно рад найти этот рабочий ответ в океане шума SQL-серверов.

Amalgovinus 11.06.2019 04:28

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

USE Master
GO

ALTER DATABASE [YourDatabase] SET READ_COMMITTED_SNAPSHOT ON
GO

У меня не было ни секунды, когда я изменил свою БД на одного пользователя

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

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

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.Transactions в .NET Framework 2.0.

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

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

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

См. Также Deadlocked, статья автора @CodingHorror

Я хотел упомянуть, поскольку не был уверен: вы может включаете READ_COMMITTED_SNAPSHOT независимо от ALLOW_SNAPSHOT_ISOLATION. Вы можете иметь ALLOW_SNAPSHOT_ISOLATIONвыключенный и по-прежнему получать выгоду от того, что READ_COMMITTED_SNAPSHOT является на. Протестировано: Microsoft SQL Server 2012 - 11.0.2100.60

Ian Boyd 18.11.2014 00:37

Эта опция изменяет способ реализации READ COMMITTED. Если этот параметр отключен, SQL Server будет использовать блокировки для управления доступом. Вот почему ваш .NET-код не генерировал предупреждения - вы все еще получали такое поведение, только что выполнялось другим (и с большей вероятностью тупиковым) способом.

Richard 24.10.2016 18:13

Это не отвечает на исходный вопрос, хотя он написан OP. Он реализует альтернативу.

Mike M 21.11.2019 01:54

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

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

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

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 '

Другие вопросы по теме