Сколько времени нужно, чтобы бежать
ALTER DATABASE [MySite] SET READ_COMMITTED_SNAPSHOT ON
Я только что запустил и это заняло 10 минут.
Как я могу проверить, применяется ли оно?
Само действие завершается почти мгновенно. Причина, по которой он не вернется, заключается в том, что он ждет, пока другие пользователи выйдут из базы данных. Это не значит, что он занят мышлением, взбалтыванием, потреблением ресурсов; он ждет, когда все выйдут из комнаты, поэтому щелкает переключателем.





Вы можете проверить статус параметра READ_COMMITTED_SNAPSHOT с помощью ракурса sys.databases. Проверьте значение столбца is_read_committed_snapshot_on. Уже спросил и ответил.
Что касается продолжительности, в электронной документации указано, что при этом не может быть никаких других подключений к базе данных, но для этого не требуется однопользовательский режим. Таким образом, вы можете быть заблокированы другими активными подключениями. Запустите sp_who (или sp_who2), чтобы увидеть, что еще подключено к этой базе данных.
благодаря. Это заняло 40 минут и показывает 0. Это база данных 740 МБ. скрестив пальцы, я не сломал это
Попробуйте открыть другое окно запроса к этой базе данных. Если можете, то я полагаю, что ваш оператор еще не запущен.
Ага. В большинстве баз данных это займет всего несколько секунд. Если требуется больше времени, он ожидает завершения другого (даже неактивного) соединения, прежде чем он сможет внести изменения. Таким образом, вам может потребоваться найти и УБИТЬ все подключенные в данный момент spids (после оценки того, что они делают). ТОГДА это должно пройти быстро.
Я рекомендую использовать опцию NO_WAIT для немедленного отказа, если есть другие открытые соединения. Например. 'ALTER DATABASE generic SET READ_COMMITTED_SNAPSHOT ON WITH NO_WAIT'
Если вы не можете найти и уничтожить другие подключенные SPID (или вам просто все равно), вы всегда можете просто перезапустить экземпляр SQL Server.
Меня заблокировал spid11, который в моем случае является серверным процессом CHECKPOINT. Запуск sp_who показал мой блок при завершении контрольной точки.
Попробуй это:
ALTER DATABASE generic SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE
Так в чем же польза от "С НЕМЕДЛЕННЫМ ОТКАТОМ"? Означает ли это, что он автоматически откатится, если запрос не удастся?
Нет, «WITH ROLLBACK IMMEDIATE» означает, что он немедленно откатит все открытые транзакции перед запуском оператора ALTER DATABASE. Я бы не советовал этого делать, если вы еще не проверили, какие транзакции открыты и можно ли их безопасно откатить.
Потрясающе, также сообщает о прогрессе закрытия соединений. Вы спасли наш бекон!
Попробуйте этот код:
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 () в кавычки (), чтобы учесть любые символы в имени базы данных, которые могут нуждаться в экранировании (например, пробелы).
вам также нужно "SET allow_snapshot_isolation ON", верно? (см. мой ответ)
Документы mssql утверждают, что вам действительно нужно установить разрешающую изоляцию моментальных снимков. Но я действительно рад найти этот рабочий ответ в океане шума SQL-серверов.
Попробуйте использовать основную базу данных перед изменением текущей базы данных.
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
Эта опция изменяет способ реализации READ COMMITTED. Если этот параметр отключен, SQL Server будет использовать блокировки для управления доступом. Вот почему ваш .NET-код не генерировал предупреждения - вы все еще получали такое поведение, только что выполнялось другим (и с большей вероятностью тупиковым) способом.
Это не отвечает на исходный вопрос, хотя он написан OP. Он реализует альтернативу.
Попробуйте отключить другие службы 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 '
ой. не был включен все это время !! (серьезно!) Это объясняет тупиковые ситуации. см. мой ответ ниже для полных выводов и лучшего сценария для запуска