Скільки часу потрібно запустити
ALTER DATABASE [MySite] SET READ_COMMITTED_SNAPSHOT ON
Я просто запустив його, і це зайняло 10 хвилин.
Як я можу перевірити, чи застосовується він?
Скільки часу потрібно запустити
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.
Схоже, Isolationlevel.ReadCommitted
це дозволено в коді, навіть якщо це не ввімкнено базою даних. Попередження не кидається. Тож зробіть собі послугу та переконайтесь, що вона увімкнена, перш ніж ви припустите, що це три роки, як я !!!
Якщо ви використовуєте 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
READ_COMMITTED_SNAPSHOT
незалежно від ALLOW_SNAPSHOT_ISOLATION
. Ви можете мати ALLOW_SNAPSHOT_ISOLATION
від і до сих пір вигоди від READ_COMMITTED_SNAPSHOT
того на . Перевірено: Microsoft SQL Server 2012 - 11.0.2100.60
Спробуйте цей код:
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
проти коробки розробників, але це зайняло 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-сервера.
Шахта бігала 5 хвилин, тоді я її скасував, бо було очевидно, що нічого не відбувається. Це абсолютно новий сервер, тому інших користувачів не підключено. Я вимкнув служби звітування SQL, а потім запустив його знову .. на завершення пішло менше секунди.