|
|
|
ASA8 - а вот еще одна непонятка
|
|||
|---|---|---|---|
|
#18+
В начале клиентской программы есть запросик, маленький, который дергает из нескольких таблиц уровень привилегий юзера. Эти данные дергаются обычным Query, после чего уровни пишутся в переменные, Query закрывается, и программа продолжает работу. Так вот, сегодня с удивлением обнаружил, что таблицы, из которых этот Query дергает данные, остаются залоченными на протяжении всей работы клиентской программы. Долго читал документацию, играл на бубне, ничего не помогало. Потом после закрытия Query от безнадежности вставил Transaction Commit, и случилось чудо - таблицы разлочились. Не понимаю, в чем прикол. Зачем нужен этот Commit, ведь никакие данные в запросе не update'лись, и Query был закрыт. Есть мысли? Может, это какая-то опция базы так настроена? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2004, 01:15 |
|
||
|
ASA8 - а вот еще одна непонятка
|
|||
|---|---|---|---|
|
#18+
У меня такое было когда клиенты (PowerBuilder) приходили через ODBC от ASA7. Сервер был ASA7.0.2 потом 9.0.1 - одинаково. Эффект не очень стойкий. Иногда блокировки появлялись, иногда не появлялись. Долго ковырялся и общался с саппортом, но ничего в итоге полезного не добился. Причем блокируются не только таблицы из которых клиент делает прямой селект, но и таблицы из которых клиент тянет информацию через хранимые процедуры. В итоге решил проблему коммитами и работой клиента в режиме Connect/Retrieve/Disconnect. Клиенты из Delphi/SaVCL или Excel/ODBC ни разу таких странных блокировок не делали. Если ваш клиент тоже PB - можно попытаться заменить ODBC на OLE DB. Вроде, не так давно, тут кто-то ругался на поддержку ODBC в PB. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2004, 02:06 |
|
||
|
ASA8 - а вот еще одна непонятка
|
|||
|---|---|---|---|
|
#18+
вот только что подумал - возможно проблема обсуждаемая вот в этом топике "Повисание" приложения при обращении к БД из той же самой оперы. Очень уж похожие симптомы. Клиент заходит, и блокирует таблицу простым селектом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2004, 02:13 |
|
||
|
ASA8 - а вот еще одна непонятка
|
|||
|---|---|---|---|
|
#18+
авторТак вот, сегодня с удивлением обнаружил, что таблицы, из которых этот Query дергает данные, остаются залоченными на протяжении всей работы клиентской программы. Блокировки накладываются и при выполнении SELECT. Другое дело, что разные - в зависимости от уровня изоляции. Как минимум накладывается блокировка SHARED (запрет изменения структуры таблицы), но например для SERIALIZABLE накладываются эксклюзивные блокировки, запрещающие изменение информации. Для других уровней изоляций тоже могут в зависимости от ситуации и того, как клиент читает данные накладываться блокировки - от еденичных до групповых. Так что это не ошибка, а правильный закон - на клиенте после SELECT всегда COMMIT или ROLLBACK. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2004, 05:50 |
|
||
|
ASA8 - а вот еще одна непонятка
|
|||
|---|---|---|---|
|
#18+
В догонку - естественно блокировки, возникающие при SELECT могут блокировать только писателей, если блокируются читатели, то это явная ошибка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2004, 05:51 |
|
||
|
ASA8 - а вот еще одна непонятка
|
|||
|---|---|---|---|
|
#18+
К сожалению, я не могу ODBC выкинуть, клиент только через него работает :( Пока насовал везде COMMITов, вроде, помогло ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2004, 13:20 |
|
||
|
ASA8 - а вот еще одна непонятка
|
|||
|---|---|---|---|
|
#18+
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 и подниматься только при выполнении критичных обработок на время обработки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2004, 01:13 |
|
||
|
ASA8 - а вот еще одна непонятка
|
|||
|---|---|---|---|
|
#18+
авторДа, еще проверить нужно какой в БД прописан isolation level, при нормальном проектировании он должен стоять 0 и подниматься только при выполнении критичных обработок на время обработки. Лучше все таки 1 (READ COMMITED), так надежнее будет, тем более ASA на нем блокирует только текущую обрабатываемую запись курсора и этот уровень изоляции не несет в себе в отличие от следующих уровней изоляций каких то ограничений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2004, 01:23 |
|
||
|
ASA8 - а вот еще одна непонятка
|
|||
|---|---|---|---|
|
#18+
ASCRUS авторДа, еще проверить нужно какой в БД прописан isolation level, при нормальном проектировании он должен стоять 0 и подниматься только при выполнении критичных обработок на время обработки. Лучше все таки 1 (READ COMMITED), так надежнее будет, тем более ASA на нем блокирует только текущую обрабатываемую запись курсора и этот уровень изоляции не несет в себе в отличие от следующих уровней изоляций каких то ограничений. А мне по душе больше 0. а 1 и выше там где нужно. Яже не делаю закрытие месяца с изоляцией 0. А вообще, от стиля работы клиента сильно зависит. В РВ datawindow позволяют иметь клиенту очень короткие транзакции. Несколько проектов живут уже по 4-5 лет с изоляцией 0 и нареканий от пользователей пока не было. А вот когда стоит сериализация, а бухгалтерия вдруг решает обновременно закрыть 2 разных месяца, то deadlock пару раз за все время случался. Но ASA корретненько все откатила откатила, а пользователи повторили операцию :). А еще с уровнем 0 очень удобно тестить заливку данных в БД. Я через isql заливаю порцию и не комичу ее. А из клиента смотрю отчеты и сравниваю итоговые цифры. Если что не туда поехало - rollback и все дела. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2004, 19:37 |
|
||
|
|

start [/forum/topic.php?fid=55&msg=32770553&tid=2014104]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
157ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
| others: | 257ms |
| total: | 507ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...