Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 "Вложенные транзакции" или зачем нужна эта профанация ?  [new]
Oleg F
Guest
Меня давно, сразу после появления MS SQL 7.0, интересовал вопрос, зачем там нужны "вложенные транзакции" в том непонятном виде, в котором они там появились. Я надеялся, что в MS SQL 2000 они станут настоящими, а SQL 7.0 просто сделал первый шаг. Но всё осталось по-прежнему! Подскажите мне, для чего они нужны ? Кто-нибудь их использует и зачем?
Чтобы было понятно, что я имею вввиду, выполните скрипт (см. ниже). При нормальной реализации вложенны транзакций в таблице были бы строки 1, 2, 6, 7. Но при реализации в SQL 2000 там остаются только строки 6 и 7, да ещё и сообщение об ошибке вылетает.

create table #t1 (code int)
begin transaction
 insert into #t1 (code) values (1)
 insert into #t1 (code) values (2)
 begin transaction
   insert into #t1 (code) values (3)
   insert into #t1 (code) values (4)
 rollback transaction
 insert into #t1 (code) values (6)
 insert into #t1 (code) values (7)
commit transaction
select * from #t1
drop table #t1
go
27 янв 05, 15:24    [1278948]     Ответить | Цитировать Сообщить модератору
 Re: "Вложенные транзакции" или зачем нужна эта профанация ?  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Вложенных транзакций нет.
27 янв 05, 15:26    [1278955]     Ответить | Цитировать Сообщить модератору
 Re: "Вложенные транзакции" или зачем нужна эта профанация ?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Но при реализации в SQL 2000 там остаются только строки 6 и 7, да ещё и сообщение об ошибке вылетает.

Все работает так как документировано. Выдумывать свою логику как бы это могло выполнятся не надо
27 янв 05, 15:37    [1279030]     Ответить | Цитировать Сообщить модератору
 Re: "Вложенные транзакции" или зачем нужна эта профанация ?  [new]
ЛП
Guest
Oleg F
При нормальной реализации вложенны транзакций в таблице были бы строки 1, 2, 6, 7.

Интересно, а что автор понимает под "нормальной реализацией"?
В "классическом" понимании транзакции в принципе не могут быть вложенными. Если что-то закоммитилось, то это навсегда, независимо от внешних откатов.

Можно конечно изменить определение транзакций, сделать Durability вложенных транзакций не абсолютной, а только в пределах внешней транзакции. Но, насколько мне известно, кроме MS Access такая методика нигде не реализована (хотя иногда было бы полезно).
27 янв 05, 15:46    [1279086]     Ответить | Цитировать Сообщить модератору
 Re: "Вложенные транзакции" или зачем нужна эта профанация ?  [new]
злой шаман
Member

Откуда: Питер
Сообщений: 1253
Можно так, но только один уровень вложенности.

create table #t1 (code int)
begin transaction
 insert into #t1 (code) values (1)
 insert into #t1 (code) values (2)
 save transaction mysavepoint
   insert into #t1 (code) values (3)
   insert into #t1 (code) values (4)
 rollback transaction mysavepoint
 insert into #t1 (code) values (6)
 insert into #t1 (code) values (7)
commit transaction
select * from #t1
drop table #t1
go
27 янв 05, 15:56    [1279146]     Ответить | Цитировать Сообщить модератору
 Re: "Вложенные транзакции" или зачем нужна эта профанация ?  [new]
yuniki
Member

Откуда:
Сообщений: 1171
Ну да есть некоторая морока голов.
Вы по сути говорите о том, что соответствует автономным трпнзакциям Oracle.

Но если принять эти правила MsSQL (в смысле именования транзакций), то
нужны они , чтобы писать ХП, котрые могли бы вызываться с различного уровня вложенности транзакций :
- как при @@TRANCOUNT=0, когда сделав свое дело, они бы закоммитились, или при неудаче, откатили свою беду ;
- так и при @@TRANCOUNT>0, чтобы при встрече внутри ХП новой begin tran программа не ломалась по ошибке,
и одновременно эта внутренняя ХП, с помощью begin tran , commit tran наращивает @@TRANCOUNT и сбрасывает,
что позволяет ей знать свой уровень вложенности, чтоб иметь возможность использовать это знание.

Т.е. будучи вызванной с @@TRANCOUNT=0, ХП работает полноценно ,
будучи вызванной с @@TRANCOUNT>0, ХП может понять свой уровень вложенности, чтобы использовать.

PS. А вообще, конечно, вкупе с тем, что существует в MsSQL с обработкой (точнее ее отсутствием) ошибок, это фича повышает ненадежность работы. Скажем, когда транзакция срывается и остаются не декрементированные @@TRANCOUNT.
27 янв 05, 16:04    [1279182]     Ответить | Цитировать Сообщить модератору
 Re: "Вложенные транзакции" или зачем нужна эта профанация ?  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Пардон, что пишу в этот топик, потому как офф.

2yuniki: вы могли бы зайти во вчерашнее обсуждение вашего вопроса об отчетах - https://www.sql.ru/forum/actualthread.aspx?tid=154669&pg=4 - потому как ответы вам вчера были. Конечно, если для вас тема закрыта, то обсуждать нечего. Но тогда позвольте усомниться в открывшейся вам истине...
27 янв 05, 16:16    [1279253]     Ответить | Цитировать Сообщить модератору
 Вот я говорю...  [new]
Oleg F
Guest
Вот и я говорю, что наличие переменной @@TRUNCOUNT морочит голову. Если бы вложенных транзакций не было вообще, то не было бы и @@TRUNCOUNT, которая увеличивается и уменьшается в зависимости от уровня вложенности.
Вполне бы хватило перемнной @@TRUNCOUNT, которая принмает только два значения, 0 и 1.
Просто у нас разработчики многие путаются. Я администратор БД и вижу, как они кладут на сервер хранимые процедуры и триггеры, внутри которых написана логика с использованием вложенных транзакций, явно рассчитанная на то, что ROLLBACK откатить только то, что внутри вложенной транзакции, а COMMIT зафиксирует то же самое. Приходится им объянять, что "вложенный транзкации" - это туфта, показывать разделы докумнетации. В конце концов их "не может быть!" сменяется пониманием... Но на это тратится время.
27 янв 05, 16:16    [1279256]     Ответить | Цитировать Сообщить модератору
 Re: "Вложенные транзакции" или зачем нужна эта профанация ?  [new]
yuniki
Member

Откуда:
Сообщений: 1171
GreenSunrise > Пардон, что пишу в этот топик, потому как офф.
Могу немного позже.
27 янв 05, 16:37    [1279388]     Ответить | Цитировать Сообщить модератору
 Re: "Вложенные транзакции" или зачем нужна эта профанация ?  [new]
Alexey Sh
Member

Откуда: SPB
Сообщений: 1930
Автономные транзакции Оракла здесь ни причём, образно говоря они не вложенные, а живущие "рядом" причём на одном коннекте. аксессная модель конечно приятная, но провоцирует программиста применять ROLLBACK для реализации логики.
27 янв 05, 17:15    [1279629]     Ответить | Цитировать Сообщить модератору
 Re: "Вложенные транзакции" или зачем нужна эта профанация ?  [new]
BootMaker
Member

Откуда: С-Петербург
Сообщений: 902
Действительно, что делать с недокументированными @@trancount?
Допустим, мне надо реализовать простой пример:
create table tbl(id int identity,field varchar(50))
declare @i bit

begin tran
  insert tbl(field) select 'test1'
  select @i=1 --or 0
  begin tran
    insert tbl(field) select 'test2'
    if @i=1
  rollback tran 
    else 
  commit tran	
  insert tbl(field) select 'test3'
commit tran

select * from tbl
drop table tbl

Если @i=1, commit на внешней транзакции выдает ошибку. Конечно, мы можем сказать
if @@trancount>0 commit tran
, но если мы программируем только внутреннюю транзакцию, кто нам даст такую возможность? Или имеет смысл делать условие
if @@trancount>0 commit tran
негласным правилом всегда? Как правильно обходить такие ситуации с внешними коммитами?
27 янв 05, 18:46    [1280039]     Ответить | Цитировать Сообщить модератору
 Re: "Вложенные транзакции" или зачем нужна эта профанация ?  [new]
x
Guest
BootMaker
Действительно, что делать с недокументированными @@trancount?
Допустим, мне надо реализовать простой пример:
...
Как правильно обходить такие ситуации с внешними коммитами?

прочитай про savepoint, посмотри обсуждение шаблонов процедур в форуме
27 янв 05, 19:25    [1280150]     Ответить | Цитировать Сообщить модератору
 Re: "Вложенные транзакции" или зачем нужна эта профанация ?  [new]
BootMaker
Member

Откуда: С-Петербург
Сообщений: 902
savepoint здесь не поможет.
Задача не в том, чтобы откатить вложенную транзакцию атомарно, а в том, чтобы откатить и внешнии транзакции, не боясь, что где-то останутся "незакрытые" коммиты.
27 янв 05, 19:34    [1280162]     Ответить | Цитировать Сообщить модератору
 Re: "Вложенные транзакции" или зачем нужна эта профанация ?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Вот автономные транзакции в Oracle есть истинная профанация!
Это ж как так?... Допустим, есть две ХП, одна зовет другую, в обеих объявляются транзакции (то бишь - атомарные сделки), вызываемая входит в транзакцию (атомарную сделку) вызывающей и любая ошибка в вызываемой есть по сути ошибка всей сделки, а, следовательно вся сделка и должна откатиться... Ан, нет, нам говорят, что, мол, придумали автономную транзакцию, при откате которой не произойдет отката транзакции которая её вызвала...
Простите, но это уже не транзакция, а истинная профанация, противоречащая самой сути и принципам ТРАНЗАКЦИИ.

Да, в MSSQL "вложенных" транзакций не было, нет и, надеюсь - не будет.
28 янв 05, 07:27    [1280575]     Ответить | Цитировать Сообщить модератору
 Re: "Вложенные транзакции" или зачем нужна эта профанация ?  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
Правильно, это не транзакция, а две вполне независимые транзакции :) В одном сеансе правда. Осень удобно кстати. Например фиксировать ПОПЫТКУ изменения. Это то что на поверхности :) У автономных транзакций очень много применений, кроме того Oracle активно использует их для собственных нужд.

Не нужно говорить ПРОФАНАЦИЯ, если Вы не до конца разбираетесь в сути вопроса.
28 янв 05, 07:50    [1280596]     Ответить | Цитировать Сообщить модератору
 Re: "Вложенные транзакции" или зачем нужна эта профанация ?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Gluk (Kazan)
Правильно, это не транзакция, а две вполне независимые транзакции :) В одном сеансе правда. Осень удобно кстати. Например фиксировать ПОПЫТКУ изменения. Это то что на поверхности :) У автономных транзакций очень много применений, кроме того Oracle активно использует их для собственных нужд.

Не нужно говорить ПРОФАНАЦИЯ, если Вы не до конца разбираетесь в сути вопроса.
Мы все же про транзакции или про некоторые удобства (например, для логирования ошибок все той же транзакции)?
Не надо валить всё в одну кучу, транзакция - транзакцией, удобства в конкретной реализации сервера структурированных запросов (SQL) - просто удобства. И ничего более. Это даже не филосовский вопрос.
28 янв 05, 07:56    [1280604]     Ответить | Цитировать Сообщить модератору
 Re: "Вложенные транзакции" или зачем нужна эта профанация ?  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
Еще раз повторю, это НЕ ОДНА транзакция, а ДВЕ вполне независимых и полноценных транзакции. Одна ждет завершения другой. Это ДАЖЕ не философский вопрос :) Вас никто не заставляет ими пользоваться, более того, не понимая сути выполняемых действий Вы скорее всего получите DeadLock (который снимется через ~5 сек.) Но в ряде задач обойтись без них конечно можно, но будет очень криво и ненадежно.

Я не высказываюсь о том, что мне не нравится в MS SQL. Просто не считаю себя достаточно компетентным в этом вопросе. IMHO Ваше необоснованное заявление прозвучало несколько не профессионально. Ораклоид вообще вряд-ли смог-бы его оценить иначе как неудачную шутку :(
28 янв 05, 08:05    [1280614]     Ответить | Цитировать Сообщить модератору
 Re: "Вложенные транзакции" или зачем нужна эта профанация ?  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
Кстати, В соседней ветке идет очень любопытное обсуждение по поводу удобств. Любопытно, что Вы предложите и насколько это будет прямее решений Oracle ?
28 янв 05, 08:08    [1280618]     Ответить | Цитировать Сообщить модератору
 Re: "Вложенные транзакции" или зачем нужна эта профанация ?  [new]
Павел Воронцов
Member

Откуда: Новосибирск
Сообщений: 2385
Блог
tpg
Мы все же про транзакции или про некоторые удобства (например, для логирования ошибок все той же транзакции)?
Не надо валить всё в одну кучу, транзакция - транзакцией, удобства в конкретной реализации сервера структурированных запросов (SQL) - просто удобства. И ничего более. Это даже не филосовский вопрос.
Не надо кипятиться. Пояснили же - автономная транзакция это просто ещё одна транзакция. Не больше и не меньше. Кстати сейвпойнты в Оракле тоже есть. Но мы тут не о достоинствахтех или иных продуктов говорим, а о транзакциях. Мне так кажется...
28 янв 05, 08:09    [1280622]     Ответить | Цитировать Сообщить модератору
 Re: "Вложенные транзакции" или зачем нужна эта профанация ?  [new]
TARLAN
Guest
Privet narod! Kto mne podskajet kak svyazat MSQL SERVER2000 S OPREDELENNOY PROGRAMMOY? PLEASE HELP ME! MOY EMAIL :tarlan@nm.ru
28 янв 05, 08:15    [1280629]     Ответить | Цитировать Сообщить модератору
 Re: "Вложенные транзакции" или зачем нужна эта профанация ?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Gluk (Kazan)
Еще раз повторю, это НЕ ОДНА транзакция, а ДВЕ вполне независимых и полноценных транзакции. Одна ждет завершения другой.

Вот и договорились :) - ДВЕ вполне независимых и полноценных транзакции.
Я реализацию механизма транзакций в оракле не обсуждал. Я проехался по самой сути понимания ТРАЗАКЦИИ, хотя реализация её механизма в оракле мне кажется странноватой, но не лишенной определенной доли здравого смысла. Она либо применяется, либо откатывется. MSSQL именно так и реализовывает это, не важно, объявлена ли ещё транзакция внутри внешней или нет, откат "внутренней" просто рассматривается как прочая ошибка на равных условиях, которая должна привести к откату всей сделки (что вполне доходчиво документировано).
Gluk (Kazan)
IMHO Ваше необоснованное заявление прозвучало несколько не профессионально.

Вот на личности только не надо переходить, мы друг с другом очно незнакомы, а по сему разговор о профессионализме, мягко говоря, неуместен.
Gluk (Kazan)
Кстати, В соседней ветке идет очень любопытное обсуждение по поводу удобств. Любопытно, что Вы предложите и насколько это будет прямее решений Oracle ?

Я там поддержал уже предложенное решение.
Кстати, вопрос тоже скорее всего филосовский - на кой ляд нужен сервер, если у него нет клиентов? ;)
28 янв 05, 08:33    [1280648]     Ответить | Цитировать Сообщить модератору
 Re: "Вложенные транзакции" или зачем нужна эта профанация ?  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
IMHO Ваше поведение выглядит некрасивым. Не нужно быть занкомым очно чтобы понять это. Вы осуждаете вещи о которых не имеете представления. Вам стыдно признаться в собственной неправоте (опять же IMHO).
Мне не интересно дальнейшее общение с Вами.
28 янв 05, 08:38    [1280658]     Ответить | Цитировать Сообщить модератору
 Re: "Вложенные транзакции" или зачем нужна эта профанация ?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Gluk (Kazan)
IMHO Ваше поведение выглядит некрасивым. Не нужно быть занкомым очно чтобы понять это. Вы осуждаете вещи о которых не имеете представления. Вам стыдно признаться в собственной неправоте (опять же IMHO).
Мне не интересно дальнейшее общение с Вами.
Самое главное в чем я с вами соглашусь, так это в ИМХО.
28 янв 05, 09:01    [1280708]     Ответить | Цитировать Сообщить модератору
 Re: "Вложенные транзакции" или зачем нужна эта профанация ?  [new]
yuniki
Member

Откуда:
Сообщений: 1171
tpg>
Не уверен, стоите ли Вы этого, но
Попытаюсь объяснить суть автономных транзакций на примере :
У пользователя на экране находится окно с пресловутыми наклаждными, каждая из которых правится в свой транзакции , но при этом ему жутко удобно, находяь в накладной еще уметь вызывать и всякие независимые справочники для их редактирования. Редактирование справочников проходит в автономной транзакции, никак не зависящей от результатов работы внешней охватывающей транзакции редактирования накладной.
Т.е. автономные транзакции - это механизм реализации модели предметной области , когда налицо имеются независимые по сути работы, которые нужно выполнить можно сказать параллельно.
Если такого механизма в системе нет , ну что ж - приходится изощряться , извращаться. Тогда это недостаток системы.

А вобще, конечно, понятие ВЛОЖЕННЫХ ТРАНЗАКЦИЙ нуждается в определении.
Тут можно для этого понятия разное навыдумывать , например, предлагая откат или коммит вплоть до уровня номер N в глубину и т.п.
Но опять же правильность предложенного определения-модели должна определяться востребованностью в предметной области.
Тогда она будет и востребована в программировании.
28 янв 05, 14:53    [1282478]     Ответить | Цитировать Сообщить модератору
 Re: "Вложенные транзакции" или зачем нужна эта профанация ?  [new]
Alexey Sh
Member

Откуда: SPB
Сообщений: 1930
2 yuniki : Отлично! И должны мы увидеть в текущей транзакции отредактированный справочник?
28 янв 05, 14:59    [1282507]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить