Это нормально, если из одной хранимой процедуры я вызываю другую, которая устанавливает более низкий уровень изоляции транзакции? - PullRequest
3 голосов
/ 25 апреля 2009

У меня есть куча служебных процедур, которые просто проверяют некоторые условия в базе данных и возвращают результат флага. Эти процедуры выполняются с уровнем изоляции READ UNCOMMITTED, эквивалентным WITH NOLOCK.

У меня также есть более сложные процедуры, которые выполняются с SERIALIZABLE уровнем изоляции. У них тоже есть такие же чеки.

Поэтому я решил вызвать эти процедуры проверки изнутри этих сложных процедур, а не копировать код проверки.

В основном это выглядит так:

CREATE PROCEDURE [dbo].[CheckSomething]
AS
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

    BEGIN TRANSACTION

    -- Do checks

    COMMIT TRANSACTION

и

CREATE PROCEDURE [dbo].[DoSomethingImportant]
AS
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

    BEGIN TRANSACTION

    EXECUTE [dbo].[CheckSomething]

    -- Do some work

    COMMIT TRANSACTION

Это было бы хорошо, чтобы сделать это? Будет ли временно активированный нижний уровень изоляции как-то нарушать защиту более высокого уровня или все идеально безопасно?

РЕДАКТИРОВАТЬ: выполнение идет без ошибок.

1 Ответ

5 голосов
/ 25 апреля 2009

Это все здесь для SQL Server 2005. Фрагмент:

Когда вы меняете транзакцию с одного уровень изоляции к другому, ресурсы которые читаются после изменения защищены в соответствии с правилами новый уровень. Ресурсы, которые читаются до изменения продолжают быть защищены в соответствии с правилами предыдущий уровень. Например, если транзакция изменена с READ ОБЯЗАНО для СЕРИАЛИЗИРУЕМОГО, общий замки, полученные после изменения сейчас держится до конца сделка.

При выдаче SET TRANSACTION ISOLATION УРОВЕНЬ в хранимой процедуре или триггер, когда объект возвращается контролировать уровень изоляции сбрасывается до уровня, действующего, когда объект был вызван. Например, если вы установите ПОВТОРНО ПРОЧИТАЙТЕ в партии, а пакет затем вызывает хранимую процедуру который устанавливает уровень изоляции SERIALIZABLE, уровень изоляции установка возвращается к REPEATABLE READ когда хранимая процедура возвращается контроль до партии.

В этом примере:

  • Каждый уровень изоляции применяется для области действия хранимой процедуры
  • Ресурсы, заблокированные DoSomethingImportant, остаются под SERIALIZABLE
  • Ресурсы, используемые CheckSomething, ЧИТАЮТСЯ НЕКОММИТИРОВАННЫМИ
...