powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Тратзакция в транзакции
9 сообщений из 9, страница 1 из 1
Тратзакция в транзакции
    #32016294
Underking
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ситуация: я открываю транзакцию 1, запускаю процедуру, в которой открываю транзакцию 2, а потом закрываю ее (чтоб данные сохранились). Затем я возвращаюсь из процедуры и делаю откат транзакции 1.
Что случится с данными, с которыми я работал внутри транзакции 2? Они сохранятся, или откат транзакции 1 подействует и на них?
...
Рейтинг: 0 / 0
Тратзакция в транзакции
    #32016302
Alexander Chepack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По-моему, проверить быстрее можно, чем постинг писать .
Откатятся обе транзакции
...
Рейтинг: 0 / 0
Тратзакция в транзакции
    #32016312
А уважаемые коллеги не задумывались над тем вопросом, почему так много ньюансов и недопонимания при работе со вложенными транзакциями? Как мне представляется, подоплека здесь простая: ТРАНЗАКЦИЯ, ИМЕЮЩАЯ ВЛОЖЕННУЮ ТРАНЗАКЦИЮ, ТРАНЗАКЦИЕЙ НЕ ЯВЛЯЕТСЯ <STRONG>ПО ОПРЕДЕНИЮ</STRONG>. Вы можете меня закидать булыжниками, но нечто, у кого внутри живет другое нечто своей жизнью, неатомарно. Транзакция должна быть атомарна согласно определению. Т.е. либо все должно выполниться, либо ничего. А наличие внутренней транзакции сразу нарушает это требование. Не здесь ли кроется разгадка того факта, почему микрософт реализовала откат сразу всех транзакций при первом же ROLLBACK? Микрософт просто не знала, что делать с внешней транзакцией, если откатится внутренняя, так как любое действие сразу нарушит требования ACID. Выход из этого казуса был найден в виде отката сразу всех транзакций.
Исходя из этих соображений можно сделать лишь один вывод - стоит избегать употребления вложенных транзакций всеми силами.
...
Рейтинг: 0 / 0
Тратзакция в транзакции
    #32016320
NewComer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если я ничего не путаю, вам поможет savepoint, для того чтобы сохранить результаты работы второй транзакции, в случае отката первой.
...
Рейтинг: 0 / 0
Тратзакция в транзакции
    #32016323
andy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно эти действия выполнять в другом соединении (connection'е).

А вообще теоретически вложенная транзакция может быть нужна для ограничения времени lock'а.
...
Рейтинг: 0 / 0
Тратзакция в транзакции
    #32016347
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я согласен с Глебом Уфимцевым. Замечу только, что требования ACID не всеми воспринимаются как истина в конечной инстанции. Oracle, например, реализует вложенные транзакции с нарушением атомарности ACID. Но при этом решаются задачи модульности кода. В конце концов под атомарностью можно понимать тоже разные вещи. Хранимая процедура состоит из разных операторов, каждый из которых выполняет собственные действия. Значит хранимую процедуру уже можно "разложить" на элементарные операции. В хранимой процедуре процедуре можно использовать оператор IF. Значит в зависимости от некоторых условий (которые к тому же могут меняться в зависимости от действий внутри хранимой процедуры) могут выполняться либо одни, либо другие участки кода. Можно рассматривать все содержимое вложенной транзакции как один оператор IF, который выполняется или не выполняется целиком в зависимости от того, что выдано внутри вложенной транзакции - Rollback или Commit. По отношению к внешней транзакции внутренняя в таком случае выглядит атомарно.
IMHO, MS просто не стала запудривать себе мозги реализацией механизма, в котором откат может возвращать всю систему не в изначальное состояние, а в некое промежуточное (что и делают вложенные транзакции Oracle. При этом MS гордо тычет пальцем в соблюдение требований ACID. Позиция весьма удобная, но не бесспорная.
...
Рейтинг: 0 / 0
Тратзакция в транзакции
    #32016358
Владимир Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Согласен с Глебом Уфимцевым. Вложенные транзакции - нонсенс. Сам принцип "Подтвердить всё или отменить всё" не допускает возможности частичного подтверждения чего-нибудь внутри отменённой транзакции. И тем самым является крайне полезным. Отказ от этого повлечёт непредсказуемость и неоднозначность поведения системы. И сама ситуация, когда потребовались бы такие вложения, представляется мне надуманной (или непродуманной).
...
Рейтинг: 0 / 0
Тратзакция в транзакции
    #32016408
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Владимир Смирнов. Я ведь тоже с ним согласен. И никто не берется оспаривать правильность восприятия механизма вложенных транзакций в MS SQL Server. Если уж на то пошло, само понятие "вложенная транзакция" при жестком соблюдении ACID звучит как парадокс. Если транзакция атомарна, она не может включать в себя другие атомы. Значит нужно либо отказаться от этого термина как некорректно отражающего суть вещей. У MS вложенная транзакция - это реализация механизма предотката. То есть, предоставление возможности выдать такой Rollback, который откатит не только то, что было до него, но и то, что будет после.
В моем постинге, я повторю, речь идет вообще не об этом. А речь идет о том, стОит ли воспринимать требования ACID как нечто незыблемое, чему действительно безоговорочно необходимо следовать. В конце концов, эти требования придуманы такими же людьми, как те, которые сидят в MS или Oracle. Давайте исходить из того, для чего вообще нужны транзакции. Не для того же, чтобы обеспечивать атомарность как самоцель - кому она по-сути нужна в чистом виде? Атомарность придумали как часть механизма транзакций для того, чтобы гарантировать откат в то состояние, которое имела система до начала транзакции. Или для того, чтобы транзакция могла подтвердиться целиком, и была гарантия, что она подтвердилась и не произошла потеря части действий в транзакции. Так ведь реализация Oracle этих механизмов данным целям не противоречит. Буквальной трактовке ACID противоречит, а целям, для которых CAID были придуманы - нет. Вот и давайте подумаем, что для нас важнее - буквальная трактовка с бюрократической точки зрения, либо практическая ценность той или иной реализации.
Предлагаю рассмотреть два куска кода.
Вариант 1.
begin tran -- Начало одной-единственной атомарнейшей транзакции
declare @Cnt int
insert into Table1
select Fld1, Fld2 from Table2
set @Cnt=@@RowCount
if @Cnt>1 -- Выполнить следующую инструкцию только в том случае, если
-- при вставке действительно встаились какие-то записи
update Table3 set Fld3=0
-- А следующая инструкция выполняется в любом случае
update Table4 set Fld4=1
commit tran -- подтверждение атомарной транзакции

Вариант2.
begin tran -- Начало внешней транзакции
declare @Cnt int
insert into Table1
select Fld1, Fld2 from Table2
set @Cnt=@@RowCount
begin tran -- Начало вложенной транзакции
update Table3 set Fld3=0
if @Cnt>0 -- подтверждение или откат внутренней транзакции
commit tran -- в зависимости от того, произошла ли реальная вставка записей
else -- в приведенной выше инструкции
rollback tran
-- А следующая инструкция выполняется в любом случае
update Table4 set Fld4=1
commit tran -- подтверждение внешней транзакции

Комментарии Варианта2 трактуют механизм вложенных транзакций с точки зрения Oracle. В MS Вариант2 работать будет некорректно. Оба варианта реализуют одну и ту же задачу. В обоих вариантах РЕАЛЬНО нет нарушения атомарности с точки зрения ее предназначения. Буквальная трактовка атомарности устарела так же, как в свое время устарело представление людей о том, что Земля плоская. Когда придумывали буквальную трактовку, видимо, о вложенных транзакциях вообще не задумывались. А сейчас они есть фактически во всех продуктах, даже в настольных. Давайте смотреть вперед, а не хвататься судорожно за каменный топор.
...
Рейтинг: 0 / 0
Тратзакция в транзакции
    #32016427
Владимир Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Garya.
По моему мы говорим о разных вещах.
В этом случае важным становится не те слова, которые мы произносим, а те понятия, которые мы в них вкладываем.
Я убеждён, что необходимо наличие некоего механизма, обеспечивающего мне гарантию возврата к состоянию, непосредственно прешествующему началу выполнения последовательности операций. Обычно это называют механизмом транзакций. В приведённых Вами примерах уместнее было бы говорить об откатах в некие промежуточные состояния внутри транзакции. В MS SQL для этого применяется savepoint, как справедливо заметил NewComer.
И вопрос здесь не в правильности или неправильности самого термина или определения, а в том кто как это понимает.
А то ведь можно упираться и доказывать, что 10 / 2 = 4 (в восьмеричной системе)
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Тратзакция в транзакции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]