Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Зависание транзакции....  [new]
Hibernate
Member

Откуда: Киев
Сообщений: 1670
странно все как-то: вот запустил первый вариант и ошибка была сгенерирована сервером....
еще пол-часа назад она не генерилась!!!

что на это может влиять? с сервером за это время никто ничего не делал вроде....
12 авг 03, 12:09    [297013]     Ответить | Цитировать Сообщить модератору
 Re: Зависание транзакции....  [new]
Hibernate
Member

Откуда: Киев
Сообщений: 1670
Итак, новая серия - сил уже моих нет.... :-(((
есть 2 хранимки: sp1 и sp2
в первой хранимке открывается транзакция, потом запускается sp2.
В sp2 никаких транзакций нет, есть только куча проверок и операторы RAISERROR 13091 'Ошибка траля-ля'

в Sp1 после вызова Sp2 стоит стандартная "обработка" ошибки:
IF @@Error <> 0

BEGIN
ROLLBACK TRAN
RETURN
END
COMMIT TRAN


на клиенте вызывется sp1 через Adodb.Command.Execute.

Все это работает просто на ура до тех пор пока не происходит TimeOut где-то внтури транзакции (быстрее всего внтури sp2).
После этого на клиенте возникает ошибка TimeOut Expaired, а на сервере остается открытая транзакция!!!!
И что я делаю не так?
Да, это все происходит на MsSqlServer2kSp2.
30 окт 03, 12:20    [399519]     Ответить | Цитировать Сообщить модератору
 Re: Зависание транзакции....  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Судя по всему, при повторном использовании хендла для разных батчей каждый батч надо предварять чем-то вроде

set nocount on
set rowcount 0
set .....

if @@trancount <> 0 begin

raiserror( 'Проблемы какие-то с транзакциями! Все пропало!', 16, 1 )
rollback tran

end

и т.д. или переоткрывать хендлы на каждый батч , что тоже не выход.
30 окт 03, 13:40    [399747]     Ответить | Цитировать Сообщить модератору
 Re: Зависание транзакции....  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
В Delphi так орет не сервер, так орет клиент.
У ADO'шных компонентов по умолчанию проставлен таймаут в 30 секунд (кажется), после истечения коего выполнение прервывается, но коннект, ессно, висит.
Поставь соединению таймаут "Бесконечный" (по моему 0), и, скорее всего, должно попустить.

B.R. Alexey
30 окт 03, 20:17    [400681]     Ответить | Цитировать Сообщить модератору
 Re: Зависание транзакции....  [new]
Hibernate
Member

Откуда: Киев
Сообщений: 1670
2locky:
это не выход, таймауты мне нужны... вопрос в том, почему не отрубается транзакция при выходе из sp... похоже, ADO глючит как-то....

пока что воспользовался советом Crimean - после каждого ADODB.Command.Execute делаю еще один Execute, который откатывает все открытые транзакции.

Блин, на клиенте у меня нет управления транзакциями - все на сервере!!! И почему после стольких усилий опять приходится вмешивать в этот процесс клиента!!!???
31 окт 03, 10:54    [401102]     Ответить | Цитировать Сообщить модератору
 Re: Зависание транзакции....  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Ты не путай две вещи с транзакциями!
Транзакции, да, должны быть только на сервер-сайде. На крайняк - в батче. Но - в одном. И это хорошо :)
Но есть второй момент. Пока MS не поборет на уровне "By Design" ошибки типа 208 или идеологически не обойдет ROLLBACK в триггере, в модуле, управляющим _СОЕДИНЕНИЯМИ_ придется _ПОДЧИЩАТЬ_ за сервером. Так "у них" получился 2000 сервер, [дальше вырезано цензурой].
Представь, что происходит в веб - ориентированных проектах, да и в просто проектах с пулами соединений, где введение "безобидного" триггера рушит к [вырезано цензурой] все, написанное до этого момента. А триггера вводить приходится - при эксплуатации всплывают новые интересные моменты, таблица делится на несколько, для совместимости остается вьюха старого формата (о, какой кайф в нее вставлять - отдельная песня!) и на нее - инстедный триггер. И - оооооо - какие танцы с бубнами тут начинаются!
Помогло только то, что 99% действий с подобного рода таблицами проходят в процедурах, а то бы совсем несладко пришлось.
31 окт 03, 11:26    [401194]     Ответить | Цитировать Сообщить модератору
 Re: Зависание транзакции....  [new]
Hibernate
Member

Откуда: Киев
Сообщений: 1670
беспредел.
31 окт 03, 14:10    [401716]     Ответить | Цитировать Сообщить модератору
 Re: Зависание транзакции....  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Это все фигня по сравнению с пропаданием транзакций :(
Ситуация - есть софта , которая вставляет , назовем их "документы".
Вставляются они процедурой. Внутри процедуры - транзакция, но она нам пока не важна.
Вставляет она их через объект, который вставку оборачивает примерно такой хренью:

declare @i int

begin tran
exec @i = dbo.MyProc
if @@error <> 0 or @i <> 1 ....


и т.д. но потом скармливает этот запрос параметром другой процедуре, скажем так, аналогу sp_executesql, которая берет и делает EXEC (@Str) в итоге. Зачем сделано так мутно - отдельный вопрос и он нам тут неинтересен. Далее. Клиент написан так, что при возникновении ошибок с высоким северити просто закрывает хендл. Сам. Я с этим боролся, но потом плюнул и пока все так и осталось.

Фух. Описал.

Что это описание нам дает? Если есть глюки в коде, то EXEC(@Str) даст @@trancount after execute и т.д. - сам проверял, дает :) А это ошибка с высокой северити и т.д., то есть снятие хендла клиентом.

Так вот. На фоне этого происходит следующее - вводится документ, не один, несколько. И клиент, который их ввел их видит, но просмотр сделан с NOLOCK - тут тоже ничего не изменить. Потом кто-то другой пытается что-то сделать с этим документом - фиг! Ничего не получается, а со временем (несколько минут) документ пропадает. Вот такие приколы! То есть 101%, что софт не мог пропустить незакрытую транзакцию. Ну никак. И сам факт, что человек увидел введенный собой документ говорит о том, что он получил Ид этого документа, а Ид документа достается еще тем способом (не спрашивай почему, поверь, что не самым простым :)), но ПОСЛЕ завершения транзакции!

И как _ВОТ ЭТО_ объяснить - я не знаю. Остается грешить только на MDAC ископаемых или явно кривых версий, бо у нас стоит 2.7 / 2.8 и ничего подобного не повторяется. А у клиентов (и я им верю!) это изредка воспроизводится на фоне незначительной или значительной загрузки сервака. То есть кореляции НИ С ЧЕМ нет.

Вот это - действительно, зависание транзакции :(
31 окт 03, 15:27    [401905]     Ответить | Цитировать Сообщить модератору
 Re: Зависание транзакции....  [new]
Hibernate
Member

Откуда: Киев
Сообщений: 1670
О, брат по несчастью! У нас не все так "мутно", но тем не менее картина похожая - никакой кореляции ни с чем не заметно. И даже в простых вещах найти причину не так просто - вот с транзакциями боремся уже пару лет... Причем, эффект с таймаутами проявился буквально неделю нащад. До этого такого небыло.

грустно все это и муторно...
31 окт 03, 15:50    [401963]     Ответить | Цитировать Сообщить модератору
 Re: Зависание транзакции....  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Я сейчас буду рекомендовать ставить свежие мдаки (2,8) на все машины. Посмотрим, к чему это приведет.
Я-то думал, что это все же 208 ошибка, но нет, ошибок нет точно.
31 окт 03, 16:47    [402101]     Ответить | Цитировать Сообщить модератору
 Re: Зависание транзакции....  [new]
guest
Guest
И у меня та же песня.
Для проверки беру базу и перерисовываю на другой сервер - а там все прекрасно и никаких проблем, смотрю версии - разница в том, что установлен SP3a.
Вывод: установить SP3a.
Пойду устанавливать, потом расскажу, что получилось...
10 дек 03, 17:53    [455696]     Ответить | Цитировать Сообщить модератору
 Re: Зависание транзакции....  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Сделаю заявку на получение премиального пива за решение проблемы.

Если у вас есть процедура, которая делает begin tran , то вы попали.
Все дело в том, что выполнение этой процедуры может быть прекращено в любой момент, в том числе и непосредственно перед rollback / commit , но уже после всех совершенных действий. Причем, зачастую, без собщения каких-либо интимных подробностей в виде эксепшенов и прочих осадков в логах. Естественно, @@trancount будет в этом хендле не 0! Все следующие команды пойдут в транзакции, а при закрытии приложения все дружно откатится.

Единственно применимое на текущий момент решение - делать if @@trancount <> 0 rollback tran в начале КАЖДОГО батча.

Для сомневающихся - модель пока собрана и ситуация воспроизводится исправно. В логах только "безобидное" "command timeout".

У меня по теме все. Ситуация, по крайней мере у нас, закрылась.
26 дек 03, 17:07    [475950]     Ответить | Цитировать Сообщить модератору
 Re: Зависание транзакции....  [new]
Hibernate
Member

Откуда: Киев
Сообщений: 1670
if @@trancount <> 0 rollback tran 


мы сделали чуть по-другому: при _любой_ ошибке, возвращаемой с сервера, мы в обработчике ошибок на клиенте вызывем процедурку в которой что-то вроде:

while @@trancount <> 0 rollback tran


проблема тоже 100% решилась :-)
по крайней мере, у пользователя нет возможности в открытой транзакции сделать кучу работы, а потом закрыть приложение, и все потерять :-)
26 дек 03, 18:08    [476052]     Ответить | Цитировать Сообщить модератору
 Re: Зависание транзакции....  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Вот отсемафорил бы ты раньше, мы бы меньше сегодня парились :)
26 дек 03, 18:38    [476101]     Ответить | Цитировать Сообщить модератору
 Re: Зависание транзакции....  [new]
Hibernate
Member

Откуда: Киев
Сообщений: 1670
Вот отсемафорил бы ты раньше, мы бы меньше сегодня парились :)
дык ты ж это предложил сам еще 30 октября (№[399747]) в этом топике !
....
хотя счас перечитываю ту твою мессагу (благодаря которой мы решили проблему с транзакциями) и не могу понять, почему мы сделали именно так - вызов с клиента... до сих пор был уверен, что это твое предложение...
27 дек 03, 13:56    [476506]     Ответить | Цитировать Сообщить модератору
 Re: Зависание транзакции....  [new]
Hibernate
Member

Откуда: Киев
Сообщений: 1670
2Crimean:
и обрати внимание на мое сообщение [401102] от 31 октября в этом-же топике - там почти законченное решение :-)

классику надобно читать тщательнее! :-))))


К админам форума
(если они сюда вдруг заглянут) небольшая просьбочка - объясните мне темному как сделать ссылку на конкретное сообщение - чтоб по клику оно выскакивало вверху странички?
27 дек 03, 14:03    [476509]     Ответить | Цитировать Сообщить модератору
 Re: Зависание транзакции....  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Мы в тоже время сделали проверку на @@trancount, но по совсем другим соображениям. И она начала давать результат. Но в другом месте "наши люди" с гордостью наступили на те же грабли :) Плохо, когда несколько продуктов идут паралельно - не всегда успеваешь коллег про обойденные грабли предупреждать :)
27 дек 03, 15:58    [476553]     Ответить | Цитировать Сообщить модератору
 Re: Зависание транзакции....  [new]
Smile`
Guest
4 Hibernate
я не админ =))) но вот так вот можно, только не вверху будет, а посередине и с подсветкой в заголовке поста
https://www.sql.ru/forum/actualthread.aspx?bid=1&tid=40063&pg=2#476509

где 476509 - его номер
29 дек 03, 00:03    [476825]     Ответить | Цитировать Сообщить модератору
 Re: Зависание транзакции....  [new]
Smile
Member

Откуда:
Сообщений: 1148
просто ткните на номер поста и посмотрите в адресную строку
29 дек 03, 00:06    [476826]     Ответить | Цитировать Сообщить модератору
 Re: Зависание транзакции....  [new]
Hibernate
Member

Откуда: Киев
Сообщений: 1670
просто ткните на номер поста и посмотрите в адресную строку

спасибо, а я глупый пытался копировать ссылку прямо из странички :-)
Получалось что-то вроде javascript:Cpy('399519')
29 дек 03, 10:24    [477059]     Ответить | Цитировать Сообщить модератору
 Re: Зависание транзакции....  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31170
2Crimean, Hibernate.

Я что-то сбился. Почему это помогло:

Hibernate
мы сделали чуть по-другому: при _любой_ ошибке, возвращаемой с сервера, мы в обработчике ошибок на клиенте вызывем процедурку в которой что-то вроде:


Вроде у Crimean изначально речь шла о том, что происходит вываливание из процедуры с сохранением состояния "в транзакции" и БЕЗ сообщения об ошибках?
29 дек 03, 10:42    [477101]     Ответить | Цитировать Сообщить модератору
 Re: Зависание транзакции....  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Поясняю подробнее.
Я програмер. Тупой и храбрый.
Мне поручили написать что-то. Пишу. Получилась проца, все в лучших традициях.
Эта проца дергает другую процу, которая есть в местной доке.
Все красиво.
В клиенте (вот тут первая "ошибка", точнее - неследование рекомендациям) я делаю так: установить соединение, дернуть свою процу, дернуть другую свою процу, дернуть третью свою процу, закрыть соединение.
После вызова первой процы получаю "command timeout".
Ну и ладно, у меня НИ В ОДНОЙ ИЗ ПРОЦЕДУР транзакций нет, прочего криминала - тоже нет. Коннекшн живой, раз команда не выполнилась (да?), то повторяю ее, работаю дальше. НО! Оказывается, вызываемая мной проца делала begin tran insert insert insert commit, а command timeout работает так, что я получаю просто эксепшн "command timed out" и все. (При этом, по чьему-то гениальному плану, если у меня на входе хранимки @@trancount не равен @@trancount на выходе хранимки, то меня обвиняют во всех смертных...)
В результате после закрытия соединения все, что делалось оказывается отролбэчено. Юзера в экстазе, саппорт в охренении.
Все. Остальное есть в треде.
29 дек 03, 11:43    [477215]     Ответить | Цитировать Сообщить модератору
 Re: Зависание транзакции....  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31170
А, понятно. Я просто невнимательно читал тред.
Я при любой ошибке тоже делаю if @@trancount <> 0 rollback tran. Ещё с версии 6.0 так работало (на более старых версиях не работал, не знаю).

Всяких тонкостей, вообще, очень много. К примеру, ошибка передаётся в клиент только после прочтения последней записи в рекордсете.
29 дек 03, 11:53    [477241]     Ответить | Цитировать Сообщить модератору
 Re: Зависание транзакции....  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Всяких тонкостей, вообще, очень много.

Много - не то слово. В результате - головняк. Хотя на каждый случай есть "рекомендации". То есть разработчик чист.
29 дек 03, 12:12    [477299]     Ответить | Цитировать Сообщить модератору
 Re: Зависание транзакции....  [new]
Hibernate
Member

Откуда: Киев
Сообщений: 1670
alexeyvg
Вроде у Crimean изначально речь шла о том, что происходит вываливание из процедуры с сохранением состояния "в транзакции" и БЕЗ сообщения об ошибках?


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


Crimean
В клиенте (вот тут первая "ошибка", точнее - неследование рекомендациям) я делаю так: установить соединение, дернуть свою процу, дернуть другую свою процу, дернуть третью свою процу, закрыть соединение


Каким рекомендациям я не следую в обсуждаемом случае? Это действительно актуально - я готов следовать любым рекомендациям, лишь бы небыло головной боли. Возможно я что-то пропустил :-(
29 дек 03, 14:04    [477553]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить