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

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

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

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

Пока насовал везде COMMITов, вроде, помогло
...
Рейтинг: 0 / 0
ASA8 - а вот еще одна непонятка
    #32771599
dp_tnd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
ASA8 - а вот еще одна непонятка
    #32771601
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторДа, еще проверить нужно какой в БД прописан isolation level, при нормальном проектировании он должен стоять 0 и подниматься только при выполнении критичных обработок на время обработки.
Лучше все таки 1 (READ COMMITED), так надежнее будет, тем более ASA на нем блокирует только текущую обрабатываемую запись курсора и этот уровень изоляции не несет в себе в отличие от следующих уровней изоляций каких то ограничений.
...
Рейтинг: 0 / 0
ASA8 - а вот еще одна непонятка
    #32771799
dp_tnd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ASCRUS авторДа, еще проверить нужно какой в БД прописан isolation level, при нормальном проектировании он должен стоять 0 и подниматься только при выполнении критичных обработок на время обработки.
Лучше все таки 1 (READ COMMITED), так надежнее будет, тем более ASA на нем блокирует только текущую обрабатываемую запись курсора и этот уровень изоляции не несет в себе в отличие от следующих уровней изоляций каких то ограничений.

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

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


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