Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Тратзакция в транзакции
|
|||
|---|---|---|---|
|
#18+
Ситуация: я открываю транзакцию 1, запускаю процедуру, в которой открываю транзакцию 2, а потом закрываю ее (чтоб данные сохранились). Затем я возвращаюсь из процедуры и делаю откат транзакции 1. Что случится с данными, с которыми я работал внутри транзакции 2? Они сохранятся, или откат транзакции 1 подействует и на них? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2001, 16:51 |
|
||
|
Тратзакция в транзакции
|
|||
|---|---|---|---|
|
#18+
По-моему, проверить быстрее можно, чем постинг писать . Откатятся обе транзакции ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2001, 21:05 |
|
||
|
Тратзакция в транзакции
|
|||
|---|---|---|---|
|
#18+
А уважаемые коллеги не задумывались над тем вопросом, почему так много ньюансов и недопонимания при работе со вложенными транзакциями? Как мне представляется, подоплека здесь простая: ТРАНЗАКЦИЯ, ИМЕЮЩАЯ ВЛОЖЕННУЮ ТРАНЗАКЦИЮ, ТРАНЗАКЦИЕЙ НЕ ЯВЛЯЕТСЯ <STRONG>ПО ОПРЕДЕНИЮ</STRONG>. Вы можете меня закидать булыжниками, но нечто, у кого внутри живет другое нечто своей жизнью, неатомарно. Транзакция должна быть атомарна согласно определению. Т.е. либо все должно выполниться, либо ничего. А наличие внутренней транзакции сразу нарушает это требование. Не здесь ли кроется разгадка того факта, почему микрософт реализовала откат сразу всех транзакций при первом же ROLLBACK? Микрософт просто не знала, что делать с внешней транзакцией, если откатится внутренняя, так как любое действие сразу нарушит требования ACID. Выход из этого казуса был найден в виде отката сразу всех транзакций. Исходя из этих соображений можно сделать лишь один вывод - стоит избегать употребления вложенных транзакций всеми силами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2001, 07:26 |
|
||
|
Тратзакция в транзакции
|
|||
|---|---|---|---|
|
#18+
Если я ничего не путаю, вам поможет savepoint, для того чтобы сохранить результаты работы второй транзакции, в случае отката первой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2001, 09:06 |
|
||
|
Тратзакция в транзакции
|
|||
|---|---|---|---|
|
#18+
Можно эти действия выполнять в другом соединении (connection'е). А вообще теоретически вложенная транзакция может быть нужна для ограничения времени lock'а. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2001, 09:19 |
|
||
|
Тратзакция в транзакции
|
|||
|---|---|---|---|
|
#18+
Я согласен с Глебом Уфимцевым. Замечу только, что требования ACID не всеми воспринимаются как истина в конечной инстанции. Oracle, например, реализует вложенные транзакции с нарушением атомарности ACID. Но при этом решаются задачи модульности кода. В конце концов под атомарностью можно понимать тоже разные вещи. Хранимая процедура состоит из разных операторов, каждый из которых выполняет собственные действия. Значит хранимую процедуру уже можно "разложить" на элементарные операции. В хранимой процедуре процедуре можно использовать оператор IF. Значит в зависимости от некоторых условий (которые к тому же могут меняться в зависимости от действий внутри хранимой процедуры) могут выполняться либо одни, либо другие участки кода. Можно рассматривать все содержимое вложенной транзакции как один оператор IF, который выполняется или не выполняется целиком в зависимости от того, что выдано внутри вложенной транзакции - Rollback или Commit. По отношению к внешней транзакции внутренняя в таком случае выглядит атомарно. IMHO, MS просто не стала запудривать себе мозги реализацией механизма, в котором откат может возвращать всю систему не в изначальное состояние, а в некое промежуточное (что и делают вложенные транзакции Oracle. При этом MS гордо тычет пальцем в соблюдение требований ACID. Позиция весьма удобная, но не бесспорная. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2001, 16:09 |
|
||
|
Тратзакция в транзакции
|
|||
|---|---|---|---|
|
#18+
Согласен с Глебом Уфимцевым. Вложенные транзакции - нонсенс. Сам принцип "Подтвердить всё или отменить всё" не допускает возможности частичного подтверждения чего-нибудь внутри отменённой транзакции. И тем самым является крайне полезным. Отказ от этого повлечёт непредсказуемость и неоднозначность поведения системы. И сама ситуация, когда потребовались бы такие вложения, представляется мне надуманной (или непродуманной). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2001, 07:59 |
|
||
|
Тратзакция в транзакции
|
|||
|---|---|---|---|
|
#18+
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 работать будет некорректно. Оба варианта реализуют одну и ту же задачу. В обоих вариантах РЕАЛЬНО нет нарушения атомарности с точки зрения ее предназначения. Буквальная трактовка атомарности устарела так же, как в свое время устарело представление людей о том, что Земля плоская. Когда придумывали буквальную трактовку, видимо, о вложенных транзакциях вообще не задумывались. А сейчас они есть фактически во всех продуктах, даже в настольных. Давайте смотреть вперед, а не хвататься судорожно за каменный топор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2001, 12:52 |
|
||
|
Тратзакция в транзакции
|
|||
|---|---|---|---|
|
#18+
2 Garya. По моему мы говорим о разных вещах. В этом случае важным становится не те слова, которые мы произносим, а те понятия, которые мы в них вкладываем. Я убеждён, что необходимо наличие некоего механизма, обеспечивающего мне гарантию возврата к состоянию, непосредственно прешествующему началу выполнения последовательности операций. Обычно это называют механизмом транзакций. В приведённых Вами примерах уместнее было бы говорить об откатах в некие промежуточные состояния внутри транзакции. В MS SQL для этого применяется savepoint, как справедливо заметил NewComer. И вопрос здесь не в правильности или неправильности самого термина или определения, а в том кто как это понимает. А то ведь можно упираться и доказывать, что 10 / 2 = 4 (в восьмеричной системе) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2001, 15:18 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32016294&tid=1825119]: |
0ms |
get settings: |
5ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
33ms |
get topic data: |
6ms |
get forum data: |
3ms |
get page messages: |
29ms |
get tp. blocked users: |
1ms |
| others: | 221ms |
| total: | 312ms |

| 0 / 0 |
