Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASA8 - а вот еще одна непонятка / 10 сообщений из 10, страница 1 из 1
05.11.2004, 01:15
    #32769740
mustlive
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA8 - а вот еще одна непонятка
В начале клиентской программы есть запросик, маленький, который дергает из нескольких таблиц уровень привилегий юзера.
Эти данные дергаются обычным Query, после чего уровни пишутся в переменные, Query закрывается, и программа продолжает работу.

Так вот, сегодня с удивлением обнаружил, что таблицы, из которых этот Query дергает данные, остаются залоченными на протяжении всей работы клиентской программы. Долго читал документацию, играл на бубне, ничего не помогало. Потом после закрытия Query от безнадежности вставил Transaction Commit, и случилось чудо - таблицы разлочились.

Не понимаю, в чем прикол. Зачем нужен этот Commit, ведь никакие данные в запросе не update'лись, и Query был закрыт.

Есть мысли? Может, это какая-то опция базы так настроена?
...
Рейтинг: 0 / 0
05.11.2004, 02:06
    #32769747
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA8 - а вот еще одна непонятка
У меня такое было когда клиенты (PowerBuilder) приходили через ODBC от ASA7. Сервер был ASA7.0.2 потом 9.0.1 - одинаково.
Эффект не очень стойкий. Иногда блокировки появлялись, иногда не появлялись.
Долго ковырялся и общался с саппортом, но ничего в итоге полезного не добился. Причем блокируются не только таблицы из которых клиент делает прямой селект, но и таблицы из которых клиент тянет информацию через хранимые процедуры.
В итоге решил проблему коммитами и работой клиента в режиме Connect/Retrieve/Disconnect.
Клиенты из Delphi/SaVCL или Excel/ODBC ни разу таких странных блокировок не делали. Если ваш клиент тоже PB - можно попытаться заменить ODBC на OLE DB. Вроде, не так давно, тут кто-то ругался на поддержку ODBC в PB.
...
Рейтинг: 0 / 0
05.11.2004, 02:13
    #32769750
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA8 - а вот еще одна непонятка
вот только что подумал - возможно проблема обсуждаемая вот в этом топике "Повисание" приложения при обращении к БД из той же самой оперы. Очень уж похожие симптомы. Клиент заходит, и блокирует таблицу простым селектом.
...
Рейтинг: 0 / 0
05.11.2004, 05:50
    #32769785
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA8 - а вот еще одна непонятка
авторТак вот, сегодня с удивлением обнаружил, что таблицы, из которых этот Query дергает данные, остаются залоченными на протяжении всей работы клиентской программы.
Блокировки накладываются и при выполнении SELECT. Другое дело, что разные - в зависимости от уровня изоляции. Как минимум накладывается блокировка SHARED (запрет изменения структуры таблицы), но например для SERIALIZABLE накладываются эксклюзивные блокировки, запрещающие изменение информации. Для других уровней изоляций тоже могут в зависимости от ситуации и того, как клиент читает данные накладываться блокировки - от еденичных до групповых. Так что это не ошибка, а правильный закон - на клиенте после SELECT всегда COMMIT или ROLLBACK.
...
Рейтинг: 0 / 0
05.11.2004, 05:51
    #32769787
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA8 - а вот еще одна непонятка
В догонку - естественно блокировки, возникающие при SELECT могут блокировать только писателей, если блокируются читатели, то это явная ошибка.
...
Рейтинг: 0 / 0
05.11.2004, 13:20
    #32770553
mustlive
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA8 - а вот еще одна непонятка
К сожалению, я не могу ODBC выкинуть, клиент только через него работает :(

Пока насовал везде COMMITов, вроде, помогло
...
Рейтинг: 0 / 0
06.11.2004, 01:13
    #32771599
dp_tnd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA8 - а вот еще одна непонятка
mustliveК сожалению, я не могу ODBC выкинуть, клиент только через него работает :(

Пока насовал везде COMMITов, вроде, помогло

А на чем сам клиент писан ? Если на РВ, то должно лечиться легко. У объекта класса transaction есть свойство autocommit - False by default.

На заре работы с РВ и ASA на такие граблии натыкались. Но блокировка была только на запись. Чтение проходило нормально. Если включить autocommit , то после каждого обращения в базу автоматически будет делаться Commit.

Будет только проблема, если требуется сбросить изменения из клиента в виде транзакции (ну, там форма с окнами master - detail и при ошибке оба нужно откатить). Тут транзакцию придется прописывать ручками. Или сесть на PFC. У window_master в событии pfc_save все приготовлено - нужно только 2 события пустышки доопределить (begin_tran и end_tran, точно не помню, потому как почти 5 лет назад сделано и забыто :).

Кстати, autocommit РВ не висит в воздухе, а транслируется в параметры вызовов ODBC. Там есть соответствующее свойство. На память его не помню, а хелпов на этом компьютере нету :(. Скорее всего копать нужно именно в этом направлении.

Как я понимаю, без autocommit ODBC элементарно не закрывают внутренний, скрытый от глаз клиента, курсор, через который и читаются данные.

Да, еще проверить нужно какой в БД прописан isolation level, при нормальном проектировании он должен стоять 0 и подниматься только при выполнении критичных обработок на время обработки.
...
Рейтинг: 0 / 0
06.11.2004, 01:23
    #32771601
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA8 - а вот еще одна непонятка
авторДа, еще проверить нужно какой в БД прописан isolation level, при нормальном проектировании он должен стоять 0 и подниматься только при выполнении критичных обработок на время обработки.
Лучше все таки 1 (READ COMMITED), так надежнее будет, тем более ASA на нем блокирует только текущую обрабатываемую запись курсора и этот уровень изоляции не несет в себе в отличие от следующих уровней изоляций каких то ограничений.
...
Рейтинг: 0 / 0
06.11.2004, 19:37
    #32771799
dp_tnd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA8 - а вот еще одна непонятка
ASCRUS авторДа, еще проверить нужно какой в БД прописан isolation level, при нормальном проектировании он должен стоять 0 и подниматься только при выполнении критичных обработок на время обработки.
Лучше все таки 1 (READ COMMITED), так надежнее будет, тем более ASA на нем блокирует только текущую обрабатываемую запись курсора и этот уровень изоляции не несет в себе в отличие от следующих уровней изоляций каких то ограничений.

А мне по душе больше 0. а 1 и выше там где нужно. Яже не делаю закрытие месяца с изоляцией 0. А вообще, от стиля работы клиента сильно зависит. В РВ datawindow позволяют иметь клиенту очень короткие транзакции. Несколько проектов живут уже по 4-5 лет с изоляцией 0 и нареканий от пользователей пока не было. А вот когда стоит сериализация, а бухгалтерия вдруг решает обновременно закрыть 2 разных месяца, то deadlock пару раз за все время случался. Но ASA корретненько все откатила откатила, а пользователи повторили операцию :).

А еще с уровнем 0 очень удобно тестить заливку данных в БД. Я через isql заливаю порцию и не комичу ее. А из клиента смотрю отчеты и сравниваю итоговые цифры. Если что не туда поехало - rollback и все дела.
...
Рейтинг: 0 / 0
09.11.2004, 12:27
    #32773267
mustlive
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA8 - а вот еще одна непонятка
AutoCommit мне не особо нравится. Я предпочитаю контролировать ситуацию. К тому же, IMHO, постоянные Commit'ы будут подтормаживать базу за счет записи на винт
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASA8 - а вот еще одна непонятка / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]