Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2002.09.12;
Скачать: [xml.tar.bz2];

Вниз

2000 Ошибки с транзакцией   Найти похожие ветки 

 
KAA   (2002-08-16 11:51) [0]

При написании программы периодически допускаешь ошибки, в частности можно где-то не закрыть транзакцию. В результате клиентские приложения просто подвисают, пока не закроют подвисшего клиента. Но это блокирует работу и остальных клинетов, работающих с этой таблицей. А этих клиентов может быть штук 50, и сидят они по всему зданию.

Есть процедуры sp_lock и sp_who, с помошью которых по идее можно понять где и с чем произошла ошибка. Но как разобрать выдаваемую этими процедурами информацию я не знаю. Подскажите, что означают эти результаты.


 
KAA   (2002-08-16 11:51) [1]

51 4 0 0 DB S GRANT
53 7 0 0 DB S GRANT
54 4 0 0 DB S GRANT
55 7 0 0 DB S GRANT
56 7 0 0 DB S GRANT
57 7 0 0 DB S GRANT
58 7 0 0 DB S GRANT
59 7 0 0 DB S GRANT
60 7 0 0 DB S GRANT
61 7 0 0 DB S GRANT
62 7 0 0 DB S GRANT
63 7 0 0 DB S GRANT
64 7 0 0 DB S GRANT
65 7 0 0 DB S GRANT
66 7 0 0 DB S GRANT
67 7 0 0 DB S GRANT
67 1 85575343 0 TAB IS GRANT
68 7 312388182 0 TAB IX GRANT
68 7 1727345218 0 TAB IX GRANT
68 7 1727345218 12 KEY (4e001520a208) X GRANT
68 7 480720765 3 PAG 1:3642 IX GRANT
68 7 740197687 1 KEY (130092d8179c) X GRANT
68 7 1529772507 1 KEY (7e002223df56) X GRANT
68 7 740197687 0 TAB IX GRANT
68 7 1643868923 6 KEY (e1000b7f57de) X GRANT
68 7 1529772507 1 PAG 1:2483 IX GRANT
68 7 312388182 1 PAG 1:2469 IX GRANT
68 7 1727345218 13 PAG 1:2468 IX GRANT
68 7 633769315 1 KEY (2e00d992949f) X GRANT
68 7 633769315 1 PAG 1:2526 IX GRANT
68 7 1643868923 0 TAB IX GRANT
68 7 89767377 1 KEY (0300d2dc2e97) X GRANT
68 7 312388182 3 PAG 1:3699 IX GRANT
68 7 89767377 0 TAB IX GRANT
68 7 1727345218 14 PAG 1:3702 IX GRANT
68 7 480720765 2 PAG 1:3689 IX GRANT
68 7 633769315 17 KEY (360019f18248) X GRANT
68 7 480720765 0 TAB IX GRANT
68 7 959342482 1 PAG 1:2693 IX GRANT
68 7 1529772507 16 KEY (860056332b67) X GRANT
68 7 1529772507 15 KEY (860056332b67) X GRANT
68 7 959342482 1 KEY (8e00374934d4) X GRANT
68 7 959342482 1 KEY (8d00d9e681c6) X GRANT
68 7 459864705 1 PAG 1:2801 IX GRANT
68 7 1643868923 8 PAG 1:2804 IX GRANT
68 7 1727345218 1 KEY (2900e647255b) X GRANT
68 7 1529772507 0 TAB IX GRANT
68 7 1643868923 4 KEY (ed0007cefd99) X GRANT
68 7 633769315 0 TAB IX GRANT
68 7 312388182 3 KEY (2800094753e8) X GRANT
68 7 480720765 3 KEY (b400f3893735) X GRANT
68 7 1727345218 14 KEY (9f0084df7c75) X GRANT
68 7 1643868923 3 KEY (260137a8cf6c) X GRANT
68 7 1529772507 15 PAG 1:2978 IX GRANT
68 7 633769315 14 KEY (ac002700b7f5) X GRANT
68 7 89767377 4 KEY (2c000b211edb) X GRANT
68 7 312388182 2 KEY (a3002687b622) X GRANT
68 7 1643868923 5 KEY (e8009468cd8e) X GRANT
68 7 0 0 DB S GRANT
68 7 1643868923 1 PAG 1:3089 IX GRANT
68 7 89767377 1 PAG 1:3088 IX GRANT
68 7 480720765 1 PAG 1:3090 IX GRANT
68 7 1727345218 13 KEY (8e004ce94887) X GRANT
68 7 959342482 0 TAB IX GRANT
68 7 959342482 14 KEY (a800a164297d) X GRANT
68 7 959342482 14 KEY (a7004fcb9c6f) X GRANT
68 7 1643868923 2 KEY (e500446af889) X GRANT
68 7 959342482 13 KEY (0b012774a2ac) X GRANT
68 7 1643868923 8 KEY (02017716fc4d) X GRANT
68 7 959342482 13 KEY (0c01c9db17be) X GRANT
68 7 633769315 16 KEY (3500c866d2ca) X GRANT
68 7 480720765 1 KEY (a800c99cfe26) X GRANT
68 7 89767377 5 KEY (e00064425948) X GRANT
68 7 1727345218 11 KEY (56001430307d) X GRANT
68 7 959342482 14 PAG 1:3272 IX GRANT
68 7 959342482 13 PAG 1:3270 IX GRANT
68 7 459864705 1 KEY (49005437a738) X GRANT
68 7 1529772507 16 PAG 1:3325 IX GRANT
68 7 633769315 18 KEY (3000d195d799) X GRANT
68 7 1727345218 11 PAG 1:3310 IX GRANT
68 7 89767377 5 PAG 1:3311 IX GRANT
68 7 633769315 15 KEY (53002af513cc) X GRANT
68 7 1727345218 12 PAG 1:3306 IX GRANT
68 7 459864705 0 TAB IX GRANT
68 7 1727345218 1 PAG 1:3356 IX GRANT
68 7 633769315 18 PAG 1:3347 IX GRANT
68 7 633769315 17 PAG 1:3345 IX GRANT
68 7 740197687 1 PAG 1:276 IX GRANT
68 7 633769315 16 PAG 1:3343 IX GRANT
68 7 633769315 15 PAG 1:3341 IX GRANT
68 7 633769315 14 PAG 1:3339 IX GRANT
68 7 1643868923 6 PAG 1:3373 IX GRANT
68 7 1643868923 5 PAG 1:3371 IX GRANT
68 7 1643868923 4 PAG 1:3369 IX GRANT
68 7 1643868923 3 PAG 1:3367 IX GRANT
68 7 1643868923 2 PAG 1:3365 IX GRANT
68 7 480720765 2 KEY (d1001061ce6a) X GRANT
68 7 312388182 2 PAG 1:3414 IX GRANT
68 7 89767377 4 PAG 1:3406 IX GRANT
68 7 1643868923 6 KEY (e90084b4ed3c) X GRANT
68 7 1643868923 1 KEY (dd0084717b1e) X GRANT
68 7 312388182 1 KEY (2500d8159548) X GRANT
69 7 0 0 DB S GRANT
70 7 0 0 DB S GRANT
71 7 0 0 DB S GRANT
71 7 740197687 1 PAG 1:276 IS GRANT
71 7 740197687 0 TAB IS GRANT
71 7 740197687 1 KEY (130092d8179c) S WAIT


 
KAA   (2002-08-16 11:51) [2]

51 4 0 0 DB S GRANT
53 7 0 0 DB S GRANT
54 4 0 0 DB S GRANT
55 7 0 0 DB S GRANT
56 7 0 0 DB S GRANT
57 7 0 0 DB S GRANT
58 7 0 0 DB S GRANT
59 7 0 0 DB S GRANT
60 7 0 0 DB S GRANT
61 7 0 0 DB S GRANT
62 7 0 0 DB S GRANT
63 7 0 0 DB S GRANT
64 7 0 0 DB S GRANT
65 7 0 0 DB S GRANT
66 7 0 0 DB S GRANT
67 7 0 0 DB S GRANT
67 1 85575343 0 TAB IS GRANT
68 7 312388182 0 TAB IX GRANT
68 7 1727345218 0 TAB IX GRANT
68 7 1727345218 12 KEY (4e001520a208) X GRANT
68 7 480720765 3 PAG 1:3642 IX GRANT
68 7 740197687 1 KEY (130092d8179c) X GRANT
68 7 1529772507 1 KEY (7e002223df56) X GRANT
68 7 740197687 0 TAB IX GRANT
68 7 1643868923 6 KEY (e1000b7f57de) X GRANT
68 7 1529772507 1 PAG 1:2483 IX GRANT
68 7 312388182 1 PAG 1:2469 IX GRANT
68 7 1727345218 13 PAG 1:2468 IX GRANT
68 7 633769315 1 KEY (2e00d992949f) X GRANT
68 7 633769315 1 PAG 1:2526 IX GRANT
68 7 1643868923 0 TAB IX GRANT
68 7 89767377 1 KEY (0300d2dc2e97) X GRANT
68 7 312388182 3 PAG 1:3699 IX GRANT
68 7 89767377 0 TAB IX GRANT
68 7 1727345218 14 PAG 1:3702 IX GRANT
68 7 480720765 2 PAG 1:3689 IX GRANT
68 7 633769315 17 KEY (360019f18248) X GRANT
68 7 480720765 0 TAB IX GRANT
68 7 959342482 1 PAG 1:2693 IX GRANT
68 7 1529772507 16 KEY (860056332b67) X GRANT
68 7 1529772507 15 KEY (860056332b67) X GRANT
68 7 959342482 1 KEY (8e00374934d4) X GRANT
68 7 959342482 1 KEY (8d00d9e681c6) X GRANT
68 7 459864705 1 PAG 1:2801 IX GRANT
68 7 1643868923 8 PAG 1:2804 IX GRANT
68 7 1727345218 1 KEY (2900e647255b) X GRANT
68 7 1529772507 0 TAB IX GRANT
68 7 1643868923 4 KEY (ed0007cefd99) X GRANT
68 7 633769315 0 TAB IX GRANT
68 7 312388182 3 KEY (2800094753e8) X GRANT
68 7 480720765 3 KEY (b400f3893735) X GRANT
68 7 1727345218 14 KEY (9f0084df7c75) X GRANT
68 7 1643868923 3 KEY (260137a8cf6c) X GRANT
68 7 1529772507 15 PAG 1:2978 IX GRANT
68 7 633769315 14 KEY (ac002700b7f5) X GRANT
68 7 89767377 4 KEY (2c000b211edb) X GRANT
68 7 312388182 2 KEY (a3002687b622) X GRANT
68 7 1643868923 5 KEY (e8009468cd8e) X GRANT
68 7 0 0 DB S GRANT
68 7 1643868923 1 PAG 1:3089 IX GRANT
68 7 89767377 1 PAG 1:3088 IX GRANT
68 7 480720765 1 PAG 1:3090 IX GRANT
68 7 1727345218 13 KEY (8e004ce94887) X GRANT
68 7 959342482 0 TAB IX GRANT
68 7 959342482 14 KEY (a800a164297d) X GRANT
68 7 959342482 14 KEY (a7004fcb9c6f) X GRANT
68 7 1643868923 2 KEY (e500446af889) X GRANT
68 7 959342482 13 KEY (0b012774a2ac) X GRANT
68 7 1643868923 8 KEY (02017716fc4d) X GRANT
68 7 959342482 13 KEY (0c01c9db17be) X GRANT
68 7 633769315 16 KEY (3500c866d2ca) X GRANT
68 7 480720765 1 KEY (a800c99cfe26) X GRANT
68 7 89767377 5 KEY (e00064425948) X GRANT
68 7 1727345218 11 KEY (56001430307d) X GRANT
68 7 959342482 14 PAG 1:3272 IX GRANT
68 7 959342482 13 PAG 1:3270 IX GRANT
68 7 459864705 1 KEY (49005437a738) X GRANT
68 7 1529772507 16 PAG 1:3325 IX GRANT
68 7 633769315 18 KEY (3000d195d799) X GRANT
68 7 1727345218 11 PAG 1:3310 IX GRANT
68 7 89767377 5 PAG 1:3311 IX GRANT
68 7 633769315 15 KEY (53002af513cc) X GRANT
68 7 1727345218 12 PAG 1:3306 IX GRANT
68 7 459864705 0 TAB IX GRANT
68 7 1727345218 1 PAG 1:3356 IX GRANT
68 7 633769315 18 PAG 1:3347 IX GRANT
68 7 633769315 17 PAG 1:3345 IX GRANT
68 7 740197687 1 PAG 1:276 IX GRANT
68 7 633769315 16 PAG 1:3343 IX GRANT
68 7 633769315 15 PAG 1:3341 IX GRANT
68 7 633769315 14 PAG 1:3339 IX GRANT
68 7 1643868923 6 PAG 1:3373 IX GRANT
68 7 1643868923 5 PAG 1:3371 IX GRANT
68 7 1643868923 4 PAG 1:3369 IX GRANT
68 7 1643868923 3 PAG 1:3367 IX GRANT
68 7 1643868923 2 PAG 1:3365 IX GRANT
68 7 480720765 2 KEY (d1001061ce6a) X GRANT
68 7 312388182 2 PAG 1:3414 IX GRANT
68 7 89767377 4 PAG 1:3406 IX GRANT
68 7 1643868923 6 KEY (e90084b4ed3c) X GRANT
68 7 1643868923 1 KEY (dd0084717b1e) X GRANT
68 7 312388182 1 KEY (2500d8159548) X GRANT
69 7 0 0 DB S GRANT
70 7 0 0 DB S GRANT
71 7 0 0 DB S GRANT
71 7 740197687 1 PAG 1:276 IS GRANT
71 7 740197687 0 TAB IS GRANT
71 7 740197687 1 KEY (130092d8179c) S WAIT


 
Fiend   (2002-08-16 13:15) [3]

Совет:

Никогда не начинайте транзакцию с клиента. Т.е. Database.BeginTran, ну или как там точно метод называется ,не помню. Но многие так делают.

Если нужно сделать что то важное, что может привести к фатальным ошибкам, т.е. нужно быдет вернуть всё как было, Используйте лучше цельный батч, который будет начинаться с начала транзакции, а заканчиваться соответственно Commit. Лучше даже сделать всё это в ХП.


 
wicked   (2002-08-16 13:34) [4]

можно сделать просто - у Connection есть метод Execute, которому можно скормить
"rollback tran" (отменить)
или "while @@trancount > 0 commit tran" (сохранить всё)...

в общем - тебе решать...



 
KAA   (2002-08-18 13:23) [5]

У меня вся программа на хранимых процедурах. Внутри процедуры транзакция открывается и закрывается.
Просто были глюки, я так и не понял почему, когда не сработал откат транзакции, а выход из процедуры отработал. В результате клинит таблицы.
Меня интересует, что означает инфа, полученная с помошью команд sp_lock и sp_who? Как по ней мне узнать, на какой машине в сети произошел клин.


 
vuk   (2002-08-18 15:29) [6]

В BOL расписано все, что эти процедуры выдают.

Насчет незапуска транзакций на клиенте - не знаю, но сроду с этим никаких проблем не было. Вся работа с БД ведется исключительно через SP. Каждый вызов процедуры делается в отдельной транзакции, запускаемой с клиента. Транзакции непосредственно внутри SP не используются.
Вызов пелается через следующую процедуру (вариант для BDE):


function GetBDEDatabase(DataSet: TDBDataSet): TDatabase;
begin
result := Sessions.FindSession(DataSet.SessionName).FindDatabase(DataSet.DatabaseName);
end;

procedure ExecBDEStoredProc(Proc: TStoredProc);
begin
with GetBDEDatabase(Proc), Proc do
try
StartTransaction;
ExecProc;
Commit;
Execute("while @@Trancount > 0 commit");
except
Rollback;
raise;
end;
end;




 
KAA   (2002-08-19 17:28) [7]

Вообщем есть проблема.
В хранимой процедуре открывается транзакция, из нее запускаются другие хранимые процедуры. Если запускаемая ХП вернула ошибочный результат, происходит откат транзакции и выход их ХП. Но откат почему-то не происходит. Перед ROLLBACK TRANSACTION и после, функция @@trancount показывает одно и то же количество открытых транзакций. Естественно в результате остаются открытые транзакции и клиента клинет.


 
vuk   (2002-08-19 17:48) [8]

Попробуйте наоборот - чтобы транзакция инициировалась на клиенте, а не на сервере. Откат в этом случае тоже делается на клиенте, а ошибка в случае неудачи поднимается из SP при помощи raiserror. И попробуйте обойтись без вложенных транзакций.


 
KAA   (2002-08-19 17:55) [9]

>vuk © (19.08.02 17:48)
У меня вся программа на ХП, клиент только запускает процедуры. В связи с этим иногда приходится запускать процедуры имеющие свои транзакции, получаются вложенные. Изменить структуру программы уже нельзя.
Вообще эта вся система работает нормально. Но за последнее время у меня уже вторая ошибка, когда не откатывается транзакция.


 
vuk   (2002-08-19 18:14) [10]


>У меня вся программа на ХП, клиент только запускает процедуры.
А у меня, думаете, по-другому? :o) Тоже все исключительно на SP. Методика управления транзакциями никак не связана с вынесением логики на сервер.



 
KAA   (2002-08-19 18:32) [11]

>vuk © (19.08.02 18:14)
Что значит не связана? Транзакция открывается и закрывается внутри одной хранимой процедуры. ХП - самостоятельный законченный модуль, который может использовать другие такие же модули (ХП). У клиента только одна функция работы с базой - запуск ХП, больше ничего.


 
vuk   (2002-08-19 19:01) [12]

>Транзакция открывается и закрывается внутри одной хранимой
>процедуры.
У нас подход несколько другой. Одна операция клиента - одна транзакция. Операция может быть сложной внутри(на сервере), но она не порождает вложенных транзакций.

>У клиента только одна функция работы с базой - запуск ХП, больше
>ничего.
Аналогичная ситуация, но каждый вызов процедуры на клиенте заворачивается в собственную транзакцию.


 
KAA   (2002-08-19 19:56) [13]

> vuk © (19.08.02 19:01)
Честно говоря мне не нравится этот способ работы с базой. Если клиента вдруг выключат, получится незакрытая транзакция?
Кроме того, я могу просо командой вызвать нужную ХП.


 
vuk   (2002-08-19 20:20) [14]

>Если клиента вдруг выключат, получится незакрытая транзакция?
Нет, не получится. По правилам все незакрытые транзакции откатываются, что есть правильно.

>Кроме того, я могу просо командой вызвать нужную ХП.
Что значит "командой"? У Вас клиенты сами могут явно любые процедуры вазывать? Если нет, то в чем преимущество? Транзакцию не надо в явном виде расписывать на клиенте? Ну, это дело техники. А транзакция в результате все равно у Вас на сервере стартует, только Вы контроля над ней не имеете. Зато получаем не очень-то нужное усложнение работы на стороне сервера (особенно если вспомнить, что rollback на любом уровне вложенности откатывает все транзакции вверх по стеку), поскольку нарушается хорошее правило атомарности транзакций.



 
KAA   (2002-08-19 20:34) [15]

>Что значит "командой"? У Вас клиенты сами могут явно любые процедуры вазывать?
Клиенты не могут, зато я могу. Представь что клиент не готов, а процедуру надо запустить. Делаешь EXEC из квери аналайзера и все.
Ведь написаним базы и клиента занимаются разные люди, а база первична.
Кроме того, одну и ту же процедуру могут использовать разные клиенты. И работа с базой не зависит от ошибок клиента. Клиент может только запустить ПОЛНОСТЬЮ ГОТОВЫЙ САМОСТОЯТЕЛЬНЫЙ МОДУЛЬ, сохраняется принцип модульности. Все что можно взвалить на сервер - взваливается.

>А транзакция в результате все равно у Вас на сервере стартует, только Вы контроля над ней не имеете.
А какой контроль нужен. Если внутри процедуры, выполняющей несколько действий, происходит ошибка, откатываются все действия. Это единственное назначение транзакции у меня.


 
vuk   (2002-08-19 21:08) [16]

>Делаешь EXEC из квери аналайзера и все.
То есть хотите сказать, что я не смогу запустить процедуру, в которой нет явной транзакции из QA? :o)
>Ведь написаним базы и клиента занимаются разные люди, а база
>первична.
Старт транзакции из процедуры - это не халва по рубль-двадцать. :o) Придется чуть ли не каждую строчку проверять - как она выполнилась, причем это к бизнес логике отношения иметь не будет. Разработкой базы тоже разные люди занимаются. А ну как кто от правил разработки отойдет... Порой лучше на клиенте одну строчку написать, чем на сервере десяток.

>Кроме того, одну и ту же процедуру могут использовать разные
>клиенты. И работа с базой не зависит от ошибок клиента.
Да на здоровье! У нас работа с базой тоже от ошибок клиента не зависит.

>Клиент может только запустить ПОЛНОСТЬЮ ГОТОВЫЙ САМОСТОЯТЕЛЬНЫЙ
>МОДУЛЬ, сохраняется принцип модульности.
Совершенно верно, и это не зависит от того, кто транзакцию стартует.


 
KAA   (2002-08-20 10:08) [17]

>То есть хотите сказать, что я не смогу запустить процедуру, в которой нет явной транзакции из QA? :o)
Запустить можно, но если она отработает неправильно, а танзакцию ручками поленишься открыть?

>Придется чуть ли не каждую строчку проверять - как она выполнилась
Ну немало у меня проверок, зато они все в базе.

>Разработкой базы тоже разные люди занимаются. А ну как кто от правил разработки отойдет...
Пока я один базой занимаюсь, а если еще кто-нибудь, то пусть полностью следует заложенным правилам.

>Порой лучше на клиенте одну строчку написать, чем на сервере десяток.
Не знаю, мы обратным правилом пользуемся.
Сервер купим крутой, и вся производительность от него будет зависеть. А клиенты у нас работают и на p166.



 
Alexandr   (2002-08-20 10:14) [18]

после прочтения этой ветки меня чуть не вырвало на MSSQL.
Уж лучше я на Paradox буду писать.

Хотя щас уже очень давно пишу для Interbase.


 
3JIA9I CyKA   (2002-08-20 11:23) [19]

2Alexandr
Ну-ну 8)

Больших Вам творческих успехов.


 
Alexandr   (2002-08-20 11:40) [20]

взаимно


 
KAA   (2002-08-20 15:36) [21]

>Alexandr ©
А что собственно тебе не понравилось? Мне просто уже интересно.

Послушать вледельцев двух иномарок о том, как они обычно меняют проколатое колесо и сказать, лучше на лесопеде ездить буду. :)


 
vuk   (2002-08-20 19:20) [22]

to KAA:
>Запустить можно, но если она отработает неправильно, а
>танзакцию ручками поленишься открыть?
Ну это уже другой вопрос. Скорее психологический, а не технический. :o) Да и основной режим работы - явно не QA.

>Ну немало у меня проверок, зато они все в базе.
Ну так у нас тоже в базе.

>Сервер купим крутой, и вся производительность от него будет
>зависеть. А клиенты у нас работают и на p166.
Это все правильно, но опять же место старта транзакции не влияет на производительность.

На самом деле то, о чем мы здесь спорим очень сильно смахивает на войны остроконечников и тупоконечников. :o)

to Alexander:
Ну что Вам по этому поводу сказать... IB в некоторых применениях месьма даже не плох. У нас на нем сайт работает. И нормально рабтает. Но вот корпоративную ИС мы на нем не делаем и делать не будем. Однозначно. Рвотных же рефлексов не вызывает ни MSSQL ни IB.
IB и MS SQL разные по идеологии СУБД. MS SQL - блокировочник, а IB многоверсионник. И поэтому приемы работы с ними разные. И проблемы тоже. Да и масштабы.


 
KAA   (2002-08-20 19:59) [23]

>Ну это уже другой вопрос. Скорее психологический, а не технический. :o)
Скажем так, это стратегия. Один раз что-нибудь на клиента перенесешь, и все, это вскоре опять повторится.
А если изворачиваешься и делаешь все в ХП, просто исключена ситуация, что в клиенте будет ошибка. Присекать потенциальную ошибку, выбрав стратегию полностью исключающую ситуацию, в которой ошибка может возникнуть. Исключил возможность ошибки, и даже не думаешь о ней, о том что она может появиться. Мне кажется этот подход оправдывает себя. Особенно когда в базе уже сам черт голову сломит, ты просто знаешь что подобная ошибка появится не может.

>На самом деле то, о чем мы здесь спорим очень сильно смахивает на войны остроконечников и тупоконечников. :o)
Может быть, но иногда и из таких споров можно что-то любопытное вынести.



 
vuk   (2002-08-20 20:51) [24]

to KAA:
>Один раз что-нибудь на клиента перенесешь, и все, это вскоре
>опять повторится. А если изворачиваешься и делаешь все в ХП,
>просто исключена ситуация, что в клиенте будет ошибка.

Дак все ж в базе, я ж говорю... Кроме транзакций. И вся логика живет в базе от начала и до конца. Ошибка клиента (в нашем случае) может быть только в том, что в нем каким-то мистическим образом будет обойден явно прописанный commit. Если честно, я слабо представляю себе такую ситуацию. Если же в процессе выполнения процедуры клиент по какой-либо причине отваливается, то в результате получаем закономерный rollback. Что, опять же, правильно, поскольку это укладывается в логику работы - аварийно прерванная операция должна быть отменена. Забыть прописать commit явно не получится, т.к имеются соответствующие соглашения и имеются библиотечки, благодаря которым можно не отвлекаться на такие мелочи и созданы такие условия, что писать правильно проще и удобнее, чем писать неправильно.

>Особенно когда в базе уже сам черт голову сломит, ты просто
>знаешь что подобная ошибка появится не может.
И тот и другой подход являются приемлемыми, и позволяют не особо задумываться об ошибках. Поверьте, тот подход, который мы используем обкатан уже не на одном проекте и про незавершенные транзакции слыхом не слыхивали. А что до ноги черта, то в текущем проекте - несколько БД, больше сотни (ближе к 150) таблиц, больше 500 процедур и это далеко еще даже не середина проекта. Полет нормальный.


 
KAA   (2002-08-20 21:21) [25]

>Ошибка клиента (в нашем случае) может быть только в том, что в нем
>каким-то мистическим образом будет обойден явно прописанный commit.
Вот этотслучай и страшен. Если каким-то бразом программа проскачила момент закрытия транзакции и продолжает работать с открытой на законном основании транзакцией. И почему этот случай мистический? Мне кажется что нельзя расчитывать на идеальность клиента.
Кроме того, программа привязана к этому клиенту. Если потом придет какой-нибудь студент и начнет писать свой клиент.


 
vuk   (2002-08-20 21:35) [26]

>Вот этот случай и страшен.
Я код выше приводил. Ну не случается такой случай. Никак не хочет случаться.

>И почему этот случай мистический?
Ну тогда исходя из того кода что приведен, скажите как это может получитьтся.

>Если потом придет какой-нибудь студент и начнет писать свой
>клиент.
Студент не придет. А если и придет, то будет писать так как ему скажут. К тому же я уже сказал, что условия созданы такие, что писать не правильно - неудобно.
К примеру зачем городить огород и писать криво, если можно (в нашем случае) написать примерно такое:
ExecStoredProc(spWGE_AddItem, ["ge_id", "g_id"], [0, Ag_id ]);

И все будет правильно - все параметры подставятся и вызов завернется в транзакцию.


 
KAA   (2002-08-20 21:48) [27]

>Ну тогда исходя из того кода что приведен, скажите как это может получитьтся.
Ну а ситуация, что в программе произойдет глюк, она подвиснет или еще что?

Кроме того, а вруг кто-нибудь напишет другой клиент. Скажем для доступа по html.

>Студент не придет. А если и придет, то будет писать так как ему скажут.
Т.е. административные методы защиты. Мне кажется что технические средства предпочтительней административных.

>К тому же я уже сказал, что условия созданы такие, что писать не правильно - неудобно.
Да он не знает как писать, он пишет как умеет, а умеет плохо. (по себе сужу, сам таким был)
Получается технология хорошо, но за ней надо следить. Т.е. в другой организации может не быть таких условий и студент придет писать клиента.


 
vuk   (2002-08-20 22:19) [28]

>Ну а ситуация, что в программе произойдет глюк, она подвиснет
>или еще что?
Там две строчки:

ExecProc;
Commit;

1. Подвисаем до ухода commit на сервер (или отвалился connect) - снимаем программу - получаем rollback.
2. А подвиснуть во время commit - это надо умудриться... :o) Оно либо в базу уже ушло и значит подтвердило транзакцию либо см. случай 1.
3. Exception в этом блоке - rollback в except. Единственный вариант ошибки - в это время отвалился коннект и невозможно явно вызвать rollback, см. случай 1.

>Кроме того, а вруг кто-нибудь напишет другой клиент. Скажем для
>доступа по html.
Гм... Сама по себе идея HTML клиента мне мягко говоря не очень нравится. Хотя если read-only, то может быть. Но если уж на то пошло, то сам по себе, напрямую, такой клиент все равно в базу не пойдет, а будет реализован как набор server-side приложений. И приложения эти должны быть написаны правильно.

>Мне кажется что технические средства предпочтительней
>административных.
Это средства одного порядка. Просто они находятся в другом месте. Просто в Вашем случае это средство - правильно оформлять SP, а в нашем - правильно их вызывать. Опять же, никто не помешает тому же студенту начать криво писать SP. :o)

>Да он не знает как писать, он пишет как умеет, а умеет плохо.
Еще раз объясняю - если кто-то придет в коллектив, он будет обязан соблюдать корпоративные стандарты, в том числе и на правила вызова SP, поскольку разработка групповая.



 
KAA   (2002-08-21 09:27) [29]

>1. Подвисаем до ухода commit на сервер (или отвалился connect)
> - снимаем программу - получаем rollback.
А кто будет снимать программу?
Например я пишу программу для гостиницы, т.е. ее использовать будут 24 часа в сутки 7 дней в неделю. А мы (компьютерная служба) работаем 5 дней в неделю с 9 до 18. Ни горничные, ни кассиры не снимут подвисшую программу. Максимум минут через 20 они надумают перегрузить компьютер. Но в течении этого времени остальные не смогут работать.

>Гм... Сама по себе идея HTML клиента мне мягко говоря не очень нравится.

>Опять же, никто не помешает тому же студенту начать криво писать SP. :o)
Но если если студенту дадут писать только клиента, уже меньше шансов что глюк пропутит.
А вдруг начальству понравится?

>Еще раз объясняю - если кто-то придет в коллектив, он будет
> обязан соблюдать корпоративные стандарты, в том числе и на
> правила вызова SP, поскольку разработка групповая.
У вас все завязано на жестких внутренних правилах. Это подход типа: я ошибку не допущу, и тек то под моим руководством работают тоже не допустят, я проконтролирую. А если я уйду с этой работы, то проблемы базы - не мои проблемы.
(Я уже постучпл по дереву) вдруг у вас изменятся условя работы и все толковые люди разбегутся, а новечки не станут придерживаться ваших правил. А вот если начальник в свое время настоял бы на том, чтоб все делал сервер, горе писатели нового клиента меньше могли бы допустить ошибок.




 
Jeer   (2002-08-21 10:10) [30]

Разработка толерантных и робастных (терпимых и устойчивых) сложных систем требует обязательной работы по определенным внутренним стандартам.
Иначе это не разработка, а бардак.


 
KAA   (2002-08-21 11:32) [31]

>Jeer © (21.08.02 10:10)
Да, но может быть один общий стандарт, или два независемых.
Если база может сама обеспечивать свою безопасность, то можно ослабить контроль за написанием клиента.
Тот же дотуп через html. Я в этом не разбираюсь, и как я буду контролировать что там написано? А вот написать хранимые процедуры, которые не дудут ему сделать лишнее, я могу.


 
vuk   (2002-08-21 12:50) [32]

>А кто будет снимать программу?
То есть если у Вас клиентская программа при выполнении операции с БД зависнет, то ее даже никто прибить не попытается? Или машину перезагрузить? Интересная программа... :o)

Кстати, Ваш подход, судя по наличию этой ветки, от такой ситуации не страхует не смотря ни на что. Поэтому я и говорю, что разницы особой между ними нет.

>А вдруг начальству понравится?
Начальству не нравится в первую очередь. Оно достаточно технически подковано, чтобы понимать, что HTML и web-browser не есть хорошее средство для построения полнофункционального клиента БД, несмотря на то, что это местами сейчас модно.

>Это подход типа: я ошибку не допущу
Ничем от Вашего не отличается, т.к. что-то все равно придется писать по правилам.

>А если я уйду с этой работы, то проблемы базы - не мои
>проблемы.
Нет. Хорошая разработка должна документироваться. Далеко не всегда это выполняется, но это способ избежать проблем в будущем.

>или все толковые люди разбегутся
Если начальство такое допускает, то это плохое начальство. Такому никакие транзакции не помогут.

>А вот если начальник в свое время настоял бы на том, чтоб все
>делал сервер,
Ничего бы не поменялось. А сервер все и так делает...


>Я в этом не разбираюсь, и как я буду контролировать что там
>написано?
Где "там"? В HTML? Так этим server-side приложение должно заниматься. В нем должны соблюдаться общие правила.

>А вот написать хранимые процедуры, которые не дудут ему сделать
>лишнее, я могу.
От криво написанного клиента все равно не застраховаться. К тому же Ваш подход для корректной работы тоже требует определенной формы вызова с клиентской стороны - без транзакции. Ибо иначе он ничем от нашего не отличается. При этом надо помнить, что самым распространенным подходом как раз и является явный старт транзакции на клиенте.

Так что, как я уже написал, это все войны остроконечников с тупоконечниками...




 
KAA   (2002-08-21 13:20) [33]

>То есть если у Вас клиентская программа при выполнении операции
>с БД зависнет, то ее даже никто прибить не попытается? Или
>машину перезагрузить? Интересная программа... :o)
У нас основная часть пользователей не умеют работать с компьютерами и не хотят уметь. Машину они перезапустят, но не сразу. Снять задачу они не додумаются.

>Кстати, Ваш подход, судя по наличию этой ветки, от такой
>ситуации не страхует не смотря ни на что. Поэтому я и говорю,
>что разницы особой между ними нет.
У меня ошибка в программе, с которой я борюсь. Пока я ее не уберу, программа рабочей не будет.

>Начальству не нравится в первую очередь. Оно достаточно
>технически подковано, чтобы понимать, что HTML и web-browser не
>есть хорошее средство для построения полнофункционального
>клиента БД
Это частный случай вашего предприятия.
У нас технически подкована только компьютерная служба, больше никого.

>Нет. Хорошая разработка должна документироваться.
Это не означает, что люди будут писать по этим правилам. Их надо заставить. А если некому будет?

>>или все толковые люди разбегутся
>Если начальство такое допускает, то это плохое начальство. Такому никакие транзакции не помогут.
Ну допустим повторится август 98го и контора не сможет хорошо платить?

>>Я в этом не разбираюсь, и как я буду контролировать что там аписано?
>Где "там"? В HTML? Так этим server-side приложение должно заниматься. В нем должны соблюдаться общие правила.
Как я заставлю людей соблюдать эти правила, если я не могу понять, что он там пишет?

>От криво написанного клиента все равно не застраховаться.
Застрахуюсь. Если клиент будет глючить, он будет глючить один и не блокировать базу.

>Так что, как я уже написал, это все войны остроконечников с тупоконечниками...
Да вообщем интересно пока.




 
vuk   (2002-08-21 13:56) [34]

>Их надо заставить. А если некому будет?
Так Вашим правилам тоже нужно следовать. Определенные требования к клиенту выдвигаются в обоих случаях, просто они разные. Почему и утверждаю - никакой разницы нет.


>Застрахуюсь.
Предположим, что есть такой код(схематично):

DB.StartTransaction;
try
Proc.ExecProc; <- здесь вызов Вашей процедуры
DB.Commit;
except
db.rollback;
raise;
end;

Все, приплыли, имеем шанс заблокировать базу. Код, надо сказать, корректный, а не кривой. Вызов Вашей процедуры завернули в транзакцию на клиенте и вся конструкция уже ничем не отличается от того, что является обычным подходом при написании клиента. Как Вы будете страховаться?

>Как я заставлю людей соблюдать эти правила, если я не могу
>понять, что он там пишет?
Ответственность за соблюдение правил лежит непосредственно на разработчике. Он либо их соблюдает и тогда софт вписывается в существующую инфраструктуру (как он их будет соблюдать - проблема разработчика), либо - нет. Если нет - по рогам ему! :o)


 
KAA   (2002-08-21 14:31) [35]

>Так Вашим правилам тоже нужно следовать.
Но им должны следовать писатели сервера.

>Определенные требования к клиенту выдвигаются в обоих случаях, просто они разные.
Да, и в моем случае клиенту выдвигается меньше требований, к чему мы у себя стремимся.

>Предположим, что есть такой код(схематично):
А предположим что нету. Клиент пишется с нуля. Например на другом языке.

>Ответственность за соблюдение правил лежит непосредственно на
>разработчике. Он либо их соблюдает и тогда софт вписывается в
>существующую инфраструктуру (как он их будет соблюдать -
>проблема разработчика), либо - нет. Если нет - по рогам ему!
А мне не нужны виноватые в том, что база подвисла. Мне нужно чтоб она не подвисла.

У нас всеж разные подходы.
В вашем случае, база и клиент - одна задача. А у меня это две задачи, просто они нужны обе. Но у меня в базе есть очень много вещей, коорые клиент не использует, но может в любой момент использовать. А могу я использовать из командной строки.


 
vuk   (2002-08-21 14:43) [36]

>А предположим что нету. Клиент пишется с нуля. Например на
>другом языке.
Ну елы-палы... :-(
Вы так и не поняли о чем я. Я имею в виду ход действий на клиенте. При чем здесь язык-то?

>А мне не нужны виноватые в том, что база подвисла. Мне нужно
>чтоб она не подвисла.
Гм... При другой логике работы клиента - запросто. То есть Вы тоже завязываетесь на реализацию клиента.


 
KAA   (2002-08-21 15:09) [37]

>Вы так и не поняли о чем я. Я имею в виду ход действий на клиенте. При чем здесь язык-то?
А язык может вносить свои нюансы, из-за которых не получится такой ход действий.

Моя логика такая, если в клиенте ошибка, она должна максимум проявляться в работе с этим клиентом. Из-за нее не должна подвисать база. И нельзя закладываться на то, что клиент будет написан так и никак иначе.

>>А мне не нужны виноватые в том, что база подвисла. Мне нужно чтоб она не подвисла.
>Гм... При другой логике работы клиента - запросто. То есть Вы тоже завязываетесь на реализацию клиента.
Представьте что с базой работают два разных клиента, написанных двемя разными людьми. Мало того, у каждого клиента было много версий и на разных компьютерах стоят разные версии. Предположим в одной из версий одного из клиентов ошибка, которая еще и не всегда проявляется. Так вот она не должна мешать остальным.


 
vuk   (2002-08-21 15:25) [38]

>А язык может вносить свои нюансы, из-за которых не получится
>такой ход действий.
Транзакция - она и в Африке транзакция, и к языку программирования отношения не имеет.

>Так вот она не должна мешать остальным.
Так не получится же на все 100% это обеспечить. На все случаи жизни застраховаться не удастся.



 
KAA   (2002-08-21 15:33) [39]

>Транзакция - она и в Африке транзакция, и к языку программирования отношения не имеет.
Но кроме транзакции может потребоваться написать еще целый ряд команд. Вот там глюк и затаится.
Да и вообще, можно просто так взять и написать другую конструкцию. Неважно по какой причины, если такая ситуация возможна, значит рано или поздно она произойдет.

>Так не получится же на все 100% это обеспечить. На все случаи жизни застраховаться не удастся.
Клиент может запускать хранимые процедуры. Если ни одна из этих процедур не будет мешать другим, то и клиент уже ничего не сделает с базой.




 
vuk   (2002-08-21 15:42) [40]

>Но кроме транзакции может потребоваться написать еще целый ряд
>команд.
Елы-палы...
Я у Вас пытаюсь выяснить, что будет, если Вашу процедуру вызывать внутри транзакции... Вы уверены, что это не будет мешать другим процедурам? Меня сейчас в других конструкциях глюки не интересуют.


 
KAA   (2002-08-21 15:51) [41]

Тогда наверно мы друг друга не поняли.
Если одна хранимая процедура в базе может мешать другим процедурам, это ошибка базы. База будет рабочей когда в ней не будет ошибок.
А вот клиент это уже вторая задача. Если ошибка в клиенте, это не должно затрагивать базу. База должна остаться рабочей.


 
vuk   (2002-08-21 16:07) [42]

О! Так вот, ни в том ни в другом случае процедуры в базе друг другу мешать не будут. :o) С другой стороны неправильно написанный клиент может свести на нет все усилия.


 
KAA   (2002-08-21 16:21) [43]

Но в моем случае меньше вероятности того, что в клиенте будет такая ошибка.


 
KAA   (2002-08-21 16:29) [44]

Вообщем это можно сравнить с залезанием на скалу со страховкой и без. В обоих случаях неумелые действия могут првести к падению, но со страховкой всеж надежней.


 
Desdechado   (2002-08-21 16:57) [45]

Занимательная беседа ...
Плотник со столяром анализируют качество дров :)
А дрова-то не березовые, а из прессованного угля.


 
vuk   (2002-08-21 17:14) [46]

А я давно написал, что все это вроде войны остроконечников и тупоконечников - с какого конца яйцо разбивать. :o)


 
KAA   (2002-08-21 17:31) [47]

Самое что смешное, я могу привести веские доводы необходимости разбивания яйца как с одной, так и с другой стороны. :)



Страницы: 1 2 вся ветка

Форум: "Базы";
Текущий архив: 2002.09.12;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.64 MB
Время: 0.008 c
1-35704
Юрко
2002-09-02 14:31
2002.09.12
Работа с большими текстовыми файлами


1-35683
Grande
2002-09-02 13:48
2002.09.12
Имеется задание: прослушать определенный IP адрес в сети.


3-35609
ShuraGrp
2002-08-22 16:28
2002.09.12
TDataSet.Open приводит к тому, что все поля Visible = false


14-35914
Jan
2002-08-20 10:27
2002.09.12
Windows2000


1-35717
Namo
2002-09-02 20:22
2002.09.12
Массив объектов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский