2009-10-02 7 views
0

У меня есть длительная сохраненная процедура (около 30 минут), которая в настоящее время выполняется внутри транзакции (моментальный снимок уровня изоляции).
Я установил транзакцию для моментального снимка, чтобы избежать блокировки записей, препятствующих доступу других процессов к данным.Сделки SQL Server 2005

Что я пытаюсь сделать, это написать и прочитать из таблицы состояния, но хотя мы находимся в транзакции, которую я бы хотел написать и прочитать из таблицы состояния, как если бы я не был в сделка. Мне нужно это, чтобы другие процессы могли читать любые обновления этой таблицы моим сохраненным proc, и этот сохраненный proc также может читать любые вставки, сделанные другими процессами.

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

Итак, мой вопрос заключается в транзакции, возможно ли выполнить запрос или вызвать хранимую процедуру, которая фактически не включена в транзакцию?

ответ

0

№ Ваш единственный шанс открыть отдельный сеанс, например. используйте процедуру CLR, которая подключается обратно к другому соединению (не во внутреннем контекстном соединении).

Изоляция снимков помогает только для чтения. Для записей есть другие транзакции, которые должны использовать изоляцию моментальных снимков (или иметь READ_COMMITTED_SNAPSHOT ON в базе данных). Взаимодействие записи и записи конфликтов не имеет решения.

0

Если вы выполняете «УСТАНОВИТЬ ОПАСНОСТЬ ИЗОБРАЖЕНИЯ ОПАСНОСТИ НЕОБХОДИМО», как в своем длинном запросе, так и в запросе, который должен считывать данные из транзакции, они должны иметь возможность читать грязные данные.

Я не знаю, как это будет работать с моментальным снимком уровня изоляции, поскольку я не знаком с ним.

0

Мне нужно было бы протестировать теорию, но я думаю, что Ремус мог бы подтвердить или нет, если бы мне захотелось скрыться за пределами транзакции, чтобы внести коррективы, я бы проверял, звонит ли вызов msdb.dbo.sp_start_job 'yourjob name 'и настройка задания, которое выполняет оператор обновления, который вы хотите, будет работать.

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

Это проще, чем писать CLR хранимую процедуру, хотя я ценю, что это взлом.

А.

(тестировал - хак работал)

0

Что делает зр делать? Эффективная транзакция длится 30 минут. Скорее всего, вы плохо выполняете код (вы не использовали курсор, вы или коррелированный подзапрос или что-то еще, что связано с строкой, основанной на обработке на основе набора?), А сам sp может быть сведен к транзакции, которая не будет вызывают как можно большую блокировку.