Можно ли автоматически установить SNAPSHOT УРОВНЯ ИЗОЛЯЦИИ ТРАНЗАКЦИИ? - PullRequest
1 голос
/ 07 октября 2011

, поскольку я распознал блокировки таблиц, которые запрашиваются одновременно, я решил включить SNAPSHOT УРОВНЯ ИЗОЛЯЦИИ , который был для меня новым.

ALTER DATABASE RM2 SET SINGLE_USER WITH ROLLBACK IMMEDIATE ;
ALTER DATABASE RM2 SET ALLOW_SNAPSHOT_ISOLATION ON;
ALTER DATABASE RM2 SET READ_COMMITTED_SNAPSHOT ON;
ALTER DATABASE RM2 SET MULTI_USER;

Но теперь мне интересно, можно ли применить этот уровень изоляции автоматически ко всем существующим запросам, потому что эта БД содержит множество представлений, хранимых процедур, функций табличных значений и запрашивается многими различными приложениями (например, SSRS, SSAS, ASP.NET с ADO.NET, ADO Соединения из Excel).

Если я правильно понял, мне нужно изменить запросы, чтобы использовать IsolationLevel.Snapshot, например:

SET TRANSACTION ISOLATION LEVEL SNAPSHOT
GO
BEGIN TRAN SparePartReport
SELECT TOP 100 PERCENT * FROM DBO.Last3MonthSparepartReport
COMMIT TRAN SparePartReport

Q: Можно ли каким-то образом минимизировать усилия, потому что я не могу изменить все приложения и запросы. Другая проблема заключается в том, что я не могу напрямую применить IsoalationLevel к представлениям.

Примечание. Большинство релевантных таблиц в базе данных доступны только для чтения в течение всего дня, поскольку данные импортируются в одночасье службой Windows и хранимыми процедурами.

Заранее спасибо


Хотя ответ @ Максимилиана кажется правильным, у меня все еще возникают ситуации тупиковой ситуации / тайм-аута в приложении ASP.NET при одновременном запуске больших отчетов. Вот следующий вопрос .

Ответы [ 2 ]

3 голосов
/ 07 октября 2011

Вам не нужно использовать SNAPSHOT УРОВНЯ ИЗОЛЯЦИИ, чтобы использовать версионирование строк вместо блокировок.Вы можете просто использовать

ALTER DATABASE RM2 SET READ_COMMITTED_SNAPSHOT ON;

, чтобы сообщить вашей базе данных, что она должна использовать управление версиями строк с REAL COMMITTED уровня изоляции.И поскольку это уровень изоляции по умолчанию, все ваши текущие запросы, в которых не указан другой уровень изоляции, будут автоматически использовать управление версиями строк.

Для справки: MSDN

0 голосов
/ 25 октября 2018

При чтении из базы данных автоматически используется изоляция моментального снимка, если для базы данных установлено значение READ_COMMITTED_SNAPSHOT, а уровень изоляции транзакции - READ_COMMITTED (по умолчанию).

Тем не менее, обновления все еще используют блокировки во время чтения части оператора, если уровень изоляции транзакции не SNAPSHOT. Вы не можете указать базе данных изменить уровень изоляции транзакции по умолчанию, поскольку она ограничена соединением, а не базой данных. Вам необходимо SET TRANSACTION ISOLATION LEVEL SNAPSHOT или использовать другое средство для настройки уровня изоляции транзакции для каждого подключения.

...