![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
2000 Ошибки с транзакцией [MSSQL]
KAA © (2002-08-16 11:51:00)При написании программы периодически допускаешь ошибки, в частности можно где-то не закрыть транзакцию. В результате клиентские приложения просто подвисают, пока не закроют подвисшего клиента. Но это блокирует работу и остальных клинетов, работающих с этой таблицей. А этих клиентов может быть штук 50, и сидят они по всему зданию.
Есть процедуры sp_lock и sp_who, с помошью которых по идее можно понять где и с чем произошла ошибка. Но как разобрать выдаваемую этими процедурами информацию я не знаю. Подскажите, что означают эти результаты.
KAA (2002-08-20 21:48:00) [21]>Ну тогда исходя из того кода что приведен, скажите как это может получитьтся.
Ну а ситуация, что в программе произойдет глюк, она подвиснет или еще что?
Кроме того, а вруг кто-нибудь напишет другой клиент. Скажем для доступа по html.
>Студент не придет. А если и придет, то будет писать так как ему скажут.
Т.е. административные методы защиты. Мне кажется что технические средства предпочтительней административных.
>К тому же я уже сказал, что условия созданы такие, что писать не правильно - неудобно.
Да он не знает как писать, он пишет как умеет, а умеет плохо. (по себе сужу, сам таким был)
Получается технология хорошо, но за ней надо следить. Т.е. в другой организации может не быть таких условий и студент придет писать клиента.
vuk (2002-08-20 21:35:00) [22]>Вот этот случай и страшен.
Я код выше приводил. Ну не случается такой случай. Никак не хочет случаться.
>И почему этот случай мистический?
Ну тогда исходя из того кода что приведен, скажите как это может получитьтся.
>Если потом придет какой-нибудь студент и начнет писать свой
>клиент.
Студент не придет. А если и придет, то будет писать так как ему скажут. К тому же я уже сказал, что условия созданы такие, что писать не правильно - неудобно.
К примеру зачем городить огород и писать криво, если можно (в нашем случае) написать примерно такое:
ExecStoredProc(spWGE_AddItem, ["ge_id", "g_id"], [0, Ag_id ]);
И все будет правильно - все параметры подставятся и вызов завернется в транзакцию.
KAA (2002-08-20 21:21:00) [23]>Ошибка клиента (в нашем случае) может быть только в том, что в нем
>каким-то мистическим образом будет обойден явно прописанный commit.
Вот этотслучай и страшен. Если каким-то бразом программа проскачила момент закрытия транзакции и продолжает работать с открытой на законном основании транзакцией. И почему этот случай мистический? Мне кажется что нельзя расчитывать на идеальность клиента.
Кроме того, программа привязана к этому клиенту. Если потом придет какой-нибудь студент и начнет писать свой клиент.
vuk (2002-08-20 20:51:00) [24]to KAA:
>Один раз что-нибудь на клиента перенесешь, и все, это вскоре
>опять повторится. А если изворачиваешься и делаешь все в ХП,
>просто исключена ситуация, что в клиенте будет ошибка.
Дак все ж в базе, я ж говорю... Кроме транзакций. И вся логика живет в базе от начала и до конца. Ошибка клиента (в нашем случае) может быть только в том, что в нем каким-то мистическим образом будет обойден явно прописанный commit. Если честно, я слабо представляю себе такую ситуацию. Если же в процессе выполнения процедуры клиент по какой-либо причине отваливается, то в результате получаем закономерный rollback. Что, опять же, правильно, поскольку это укладывается в логику работы - аварийно прерванная операция должна быть отменена. Забыть прописать commit явно не получится, т.к имеются соответствующие соглашения и имеются библиотечки, благодаря которым можно не отвлекаться на такие мелочи и созданы такие условия, что писать правильно проще и удобнее, чем писать неправильно.
>Особенно когда в базе уже сам черт голову сломит, ты просто
>знаешь что подобная ошибка появится не может.
И тот и другой подход являются приемлемыми, и позволяют не особо задумываться об ошибках. Поверьте, тот подход, который мы используем обкатан уже не на одном проекте и про незавершенные транзакции слыхом не слыхивали. А что до ноги черта, то в текущем проекте - несколько БД, больше сотни (ближе к 150) таблиц, больше 500 процедур и это далеко еще даже не середина проекта. Полет нормальный.
KAA (2002-08-20 19:59:00) [25]>Ну это уже другой вопрос. Скорее психологический, а не технический. :o)
Скажем так, это стратегия. Один раз что-нибудь на клиента перенесешь, и все, это вскоре опять повторится.
А если изворачиваешься и делаешь все в ХП, просто исключена ситуация, что в клиенте будет ошибка. Присекать потенциальную ошибку, выбрав стратегию полностью исключающую ситуацию, в которой ошибка может возникнуть. Исключил возможность ошибки, и даже не думаешь о ней, о том что она может появиться. Мне кажется этот подход оправдывает себя. Особенно когда в базе уже сам черт голову сломит, ты просто знаешь что подобная ошибка появится не может.
>На самом деле то, о чем мы здесь спорим очень сильно смахивает на войны остроконечников и тупоконечников. :o)
Может быть, но иногда и из таких споров можно что-то любопытное вынести.
vuk (2002-08-20 19:20:00) [26]to KAA:
>Запустить можно, но если она отработает неправильно, а
>танзакцию ручками поленишься открыть?
Ну это уже другой вопрос. Скорее психологический, а не технический. :o) Да и основной режим работы - явно не QA.
>Ну немало у меня проверок, зато они все в базе.
Ну так у нас тоже в базе.
>Сервер купим крутой, и вся производительность от него будет
>зависеть. А клиенты у нас работают и на p166.
Это все правильно, но опять же место старта транзакции не влияет на производительность.
На самом деле то, о чем мы здесь спорим очень сильно смахивает на войны остроконечников и тупоконечников. :o)
to Alexander:
Ну что Вам по этому поводу сказать... IB в некоторых применениях месьма даже не плох. У нас на нем сайт работает. И нормально рабтает. Но вот корпоративную ИС мы на нем не делаем и делать не будем. Однозначно. Рвотных же рефлексов не вызывает ни MSSQL ни IB.
IB и MS SQL разные по идеологии СУБД. MS SQL - блокировочник, а IB многоверсионник. И поэтому приемы работы с ними разные. И проблемы тоже. Да и масштабы.
KAA (2002-08-20 15:36:00) [27]>Alexandr ©
А что собственно тебе не понравилось? Мне просто уже интересно.
Послушать вледельцев двух иномарок о том, как они обычно меняют проколатое колесо и сказать, лучше на лесопеде ездить буду. :)
Alexandr (2002-08-20 11:40:00) [28]взаимно
3JIA9I CyKA (2002-08-20 11:23:00) [29]2Alexandr
Ну-ну 8)
Больших Вам творческих успехов.
Alexandr (2002-08-20 10:14:00) [30]после прочтения этой ветки меня чуть не вырвало на MSSQL.
Уж лучше я на Paradox буду писать.
Хотя щас уже очень давно пишу для Interbase.
KAA (2002-08-20 10:08:00) [31]>То есть хотите сказать, что я не смогу запустить процедуру, в которой нет явной транзакции из QA? :o)
Запустить можно, но если она отработает неправильно, а танзакцию ручками поленишься открыть?
>Придется чуть ли не каждую строчку проверять - как она выполнилась
Ну немало у меня проверок, зато они все в базе.
>Разработкой базы тоже разные люди занимаются. А ну как кто от правил разработки отойдет...
Пока я один базой занимаюсь, а если еще кто-нибудь, то пусть полностью следует заложенным правилам.
>Порой лучше на клиенте одну строчку написать, чем на сервере десяток.
Не знаю, мы обратным правилом пользуемся.
Сервер купим крутой, и вся производительность от него будет зависеть. А клиенты у нас работают и на p166.
vuk (2002-08-19 21:08:00) [32]>Делаешь EXEC из квери аналайзера и все.
То есть хотите сказать, что я не смогу запустить процедуру, в которой нет явной транзакции из QA? :o)
>Ведь написаним базы и клиента занимаются разные люди, а база
>первична.
Старт транзакции из процедуры - это не халва по рубль-двадцать. :o) Придется чуть ли не каждую строчку проверять - как она выполнилась, причем это к бизнес логике отношения иметь не будет. Разработкой базы тоже разные люди занимаются. А ну как кто от правил разработки отойдет... Порой лучше на клиенте одну строчку написать, чем на сервере десяток.
>Кроме того, одну и ту же процедуру могут использовать разные
>клиенты. И работа с базой не зависит от ошибок клиента.
Да на здоровье! У нас работа с базой тоже от ошибок клиента не зависит.
>Клиент может только запустить ПОЛНОСТЬЮ ГОТОВЫЙ САМОСТОЯТЕЛЬНЫЙ
>МОДУЛЬ, сохраняется принцип модульности.
Совершенно верно, и это не зависит от того, кто транзакцию стартует.
KAA (2002-08-19 20:34:00) [33]>Что значит "командой"? У Вас клиенты сами могут явно любые процедуры вазывать?
Клиенты не могут, зато я могу. Представь что клиент не готов, а процедуру надо запустить. Делаешь EXEC из квери аналайзера и все.
Ведь написаним базы и клиента занимаются разные люди, а база первична.
Кроме того, одну и ту же процедуру могут использовать разные клиенты. И работа с базой не зависит от ошибок клиента. Клиент может только запустить ПОЛНОСТЬЮ ГОТОВЫЙ САМОСТОЯТЕЛЬНЫЙ МОДУЛЬ, сохраняется принцип модульности. Все что можно взвалить на сервер - взваливается.
>А транзакция в результате все равно у Вас на сервере стартует, только Вы контроля над ней не имеете.
А какой контроль нужен. Если внутри процедуры, выполняющей несколько действий, происходит ошибка, откатываются все действия. Это единственное назначение транзакции у меня.
vuk (2002-08-19 20:20:00) [34]>Если клиента вдруг выключат, получится незакрытая транзакция?
Нет, не получится. По правилам все незакрытые транзакции откатываются, что есть правильно.
>Кроме того, я могу просо командой вызвать нужную ХП.
Что значит "командой"? У Вас клиенты сами могут явно любые процедуры вазывать? Если нет, то в чем преимущество? Транзакцию не надо в явном виде расписывать на клиенте? Ну, это дело техники. А транзакция в результате все равно у Вас на сервере стартует, только Вы контроля над ней не имеете. Зато получаем не очень-то нужное усложнение работы на стороне сервера (особенно если вспомнить, что rollback на любом уровне вложенности откатывает все транзакции вверх по стеку), поскольку нарушается хорошее правило атомарности транзакций.
KAA (2002-08-19 19:56:00) [35]> vuk © (19.08.02 19:01)
Честно говоря мне не нравится этот способ работы с базой. Если клиента вдруг выключат, получится незакрытая транзакция?
Кроме того, я могу просо командой вызвать нужную ХП.
vuk (2002-08-19 19:01:00) [36]>Транзакция открывается и закрывается внутри одной хранимой
>процедуры.
У нас подход несколько другой. Одна операция клиента - одна транзакция. Операция может быть сложной внутри(на сервере), но она не порождает вложенных транзакций.
>У клиента только одна функция работы с базой - запуск ХП, больше
>ничего.
Аналогичная ситуация, но каждый вызов процедуры на клиенте заворачивается в собственную транзакцию.
KAA (2002-08-19 18:32:00) [37]>vuk © (19.08.02 18:14)
Что значит не связана? Транзакция открывается и закрывается внутри одной хранимой процедуры. ХП - самостоятельный законченный модуль, который может использовать другие такие же модули (ХП). У клиента только одна функция работы с базой - запуск ХП, больше ничего.
vuk (2002-08-19 18:14:00) [38]
>У меня вся программа на ХП, клиент только запускает процедуры.
А у меня, думаете, по-другому? :o) Тоже все исключительно на SP. Методика управления транзакциями никак не связана с вынесением логики на сервер.
KAA (2002-08-19 17:55:00) [39]>vuk © (19.08.02 17:48)
У меня вся программа на ХП, клиент только запускает процедуры. В связи с этим иногда приходится запускать процедуры имеющие свои транзакции, получаются вложенные. Изменить структуру программы уже нельзя.
Вообще эта вся система работает нормально. Но за последнее время у меня уже вторая ошибка, когда не откатывается транзакция.
vuk (2002-08-19 17:48:00) [40]Попробуйте наоборот - чтобы транзакция инициировалась на клиенте, а не на сервере. Откат в этом случае тоже делается на клиенте, а ошибка в случае неудачи поднимается из SP при помощи raiserror. И попробуйте обойтись без вложенных транзакций.