Сколько времени должно занять SET READ_COMMITTED_SNAPSHOT ON?
-
04-07-2019 - |
Вопрос
Сколько нужно времени, чтобы бежать
ALTER DATABASE [MySite] SET READ_COMMITTED_SNAPSHOT ON
Я только что запустил его, и это заняло 10 минут.
Как я могу проверить, применяется ли он?
Решение
Вы можете проверить состояние параметра READ_COMMITTED_SNAPSHOT, используя представление sys.databases
. Проверьте значение столбца is_read_committed_snapshot_on
. Уже спросил и ответил .
Что касается продолжительности, Books Online заявляет, что при этом не может быть никаких других подключений к базе данных, но для этого не требуется однопользовательский режим. Таким образом, вы можете быть заблокированы другими активными подключениями. Запустите sp_who
(или sp_who2
), чтобы узнать, что еще подключено к этой базе данных.
Другие советы
Попробуйте это:
ALTER DATABASE generic SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE
Ладно (я первоначальный спрашивающий), так что получается, что все это время у меня даже не было проклятой вещи.
Вот окончательный код для запуска, чтобы включить режим снимка и убедитесь, что он включен. Р>
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 Tips:
Похоже, 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 а>
Попробуйте этот код:
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
Я попробовал команду:
ALTER DATABASE MyDB SET READ_COMMITTED_SNAPSHOT ON
GO
против dev box, но это заняло 10+ минут, и я его убил. Р>
Затем я нашел это:
https://willwarren.com/2015/10 / 12 / sql-server-read-commit-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 '
Попробуйте использовать базу данных master перед изменением текущей базы данных.
USE Master
GO
ALTER DATABASE [YourDatabase] SET READ_COMMITTED_SNAPSHOT ON
GO
Я не потратил ни секунды на то, чтобы сменить базу данных на однопользовательскую
Попробуйте отключить другие службы SQL, чтобы работала только служба сервера SQL. Р>
Шахта побежала 5 минут, потом я отменил ее, потому что было очевидно, что ничего не происходит. Это новый сервер, так что другие пользователи не подключены. Я отключил службы отчетов SQL, а затем снова запустил его. Потребовалось менее секунды, чтобы завершить. Р>