Транзакции с правильной областью видимости в хранимых процессах

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

CREATE PROCEDURE theProc
AS
BEGIN

  BEGIN TRANSACTION

-- do some stuff

  IF @ThereIsAProblem
    ROLLBACK TRANSACTION
  ELSE
    COMMIT TRANSACTION
END

Если я вызываю эту процедуру из существующей транзакции, она может ОТКАТИТЬ внешнюю транзакцию.

BEGIN TRANSACTION
EXEC theProc
COMMIT TRANSACTION

Как правильно определить область транзакции в хранимой процедуре, чтобы хранимая процедура не откатывала внешние транзакции?

Посмотрите это видео DNR-TV, они много говорят об области видимости транзакции, хотя и обрабатывают ее в коде, а не в sql. надеюсь это поможет.

roman m 19.09.2008 03:29
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
1
423
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

используйте @@ trancount, чтобы узнать, участвуете ли вы уже в транзакции при входе

Ответ принят как подходящий

Синтаксис для этого, вероятно, зависит от базы данных. Но в Transact-SQL вы проверяете @@ TRANCOUNT, чтобы узнать, участвуете ли вы в транзакции. Если да, то вы хотите создать точку сохранения, а в конце вы можете просто пройти через конец функции (полагая, что фиксация или откат произойдут позже) или же откат к вашей точке сохранения.

Дополнительную информацию см. В документации Microsoft по точки сохранения.

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

Другие вопросы по теме