Как долго следует устанавливать READ COMMITTED SNAPSHOT на take?


сколько времени это должно занять, чтобы запустить

ALTER DATABASE [MySite] SET READ_COMMITTED_SNAPSHOT ON

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

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

8 63

8 ответов:

вы можете проверить состояние параметра 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 выше соответствует уровню изоляции.ReadCommitted в .NET
Параметр ALLOW_SNAPSHOT_ISOLATION выше соответствует уровню изоляции.Снимок в .NET

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


.NET советы:

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

если вы используете C# вы, вероятно, хотите ReadCommitted уровень изоляции и не 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())
     {

     }
}

дополнительно вы можете получить ошибки быть не может содействовать сделке. Поиск "продвижение" в Внедрение Системы.Транзакции в .NET Framework 2.0.

если вы не делаете что-то особенное, как подключение к внешней базе данных (или второй базы данных), то что-то такое же простое, как создание нового DataContext может вызвать это. У меня был кэш, который "раскручивал" свой собственный 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

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

USE Master
GO

ALTER DATABASE [YourDatabase] SET READ_COMMITTED_SNAPSHOT ON
GO

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

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

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 '

попробуйте отключить другие службы SQL, чтобы была запущена только служба SQL server.

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