Как долго следует устанавливать READ COMMITTED SNAPSHOT на take?
сколько времени это должно занять, чтобы запустить
ALTER DATABASE [MySite] SET READ_COMMITTED_SNAPSHOT ON
Я просто запустил его и это заняло 10 минут.
Как я могу проверить, если он применяется?
8 ответов:
вы можете проверить состояние параметра READ_COMMITTED_SNAPSHOT с помощью
sys.databases
вид. Проверьте значениеis_read_committed_snapshot_on
. Уже ответила.что касается продолжительности, Books Online заявляет, что при этом не может быть никаких других подключений к базе данных, но для этого не требуется однопользовательский режим. Так что вы можете быть заблокированы другими активными соединениями. Беги
sp_who
(илиsp_who2
), чтобы увидеть, что еще подключено к этой базе данных.
ОК (Я оригинальный вопрос), так что получается, что все это время у меня даже не было проклятой вещи включена.
здесь окончательный код для запуска, чтобы включить режим моментального снимка и убедитесь, что он включен.
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 и снова запустил их.. потребовалось меньше секунды.