Транзакции SQL Server 2005 - PullRequest
0 голосов
/ 02 октября 2009

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

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

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

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

Ответы [ 4 ]

0 голосов
/ 02 октября 2009

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

0 голосов
/ 02 октября 2009

Если вы выполните команду «SET TRANSACTION ISOLATION READ UNCOMMITED» как для вашего долгосрочного запроса, так и для запроса, который должен считывать данные из транзакции, они должны иметь возможность считывать грязные данные.

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

0 голосов
/ 02 октября 2009

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

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

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

A.

(проверено - взлом работает)

0 голосов
/ 02 октября 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...