|
sysmaster:syslocks
|
|||
---|---|---|---|
#18+
Не понимаю, в чем проблема. Программно (Delphi, TQuery) пытаюсь определить заблокирована ли таблица: Код: sql 1.
и этот запрос у меня или сразу орабатывает или, что чаще, виснет на очень долгое время. Хотя то же самый запрос из какого-нибудь SQL Explorer'а отрабатывает быстро и на ура.. Не могу понять, в чём причина тормозов запроса через TQuery. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2013, 17:36 |
|
sysmaster:syslocks
|
|||
---|---|---|---|
#18+
Element2, 1. TDatabase используешь? 2. при работе с sysmaster "положено" делать SET ISOLATION TO DIRTY READ; перед выполнением запроса. Скорее всего причина в этом - уровень изоляции через TQuery у тебя не совпадает с уровнем изоляции в других инструментах ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2013, 12:50 |
|
sysmaster:syslocks
|
|||
---|---|---|---|
#18+
Element2и этот запрос у меня или сразу орабатывает или, что чаще, виснет на очень долгое время. Хотя то же самый запрос из какого-нибудь SQL Explorer'а отрабатывает быстро и на ура.. вторая возможная причина - количество записей в syslocks может изменяться скачками и на большое количество. Возможно, ты при запросах "из какого-нибудь SQL Explorer'а" или не точно такой же запрос делаешь, или не в то же время :) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2013, 12:52 |
|
sysmaster:syslocks
|
|||
---|---|---|---|
#18+
АнатоЛой, Да, TDatabase. Попробую изменить уровень изоляции, может и правда причина в этом. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2013, 13:33 |
|
sysmaster:syslocks
|
|||
---|---|---|---|
#18+
Element2, начни с другого. Задача "проверить заблокирована ли таблица". А для чего? Есть подозрение, что выбран неправильный метод решения задачи... ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2013, 15:30 |
|
sysmaster:syslocks
|
|||
---|---|---|---|
#18+
АнатоЛой, задача, которую я озвучивал уже тут. Есть очень большая таблица, которая через некоторые промежутки времени пересчитывается (обновляется) хранимыми процедурами. Во время таких пересчетов необходимо запретить пользователям любое обращение к этой таблице. Моё решение было такое: Я блокирую совершенно другую таблицу, к которой никто не обращается в принципе, и в рамках одной транзакции делаю пересчёт. Если в этот момент кто-то пытается сделать select, я проверяю заблокирована ли та таблица, если да - пишу пользователю "Подождите некторое время", если нет - разрешаю выполнить запрос.. Как-то так... Всё было бы замечательно, если бы не тормоза при проверке на наличие блокировки таблицы. DIRTY READ не помог :-( ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2013, 17:02 |
|
sysmaster:syslocks
|
|||
---|---|---|---|
#18+
Element2АнатоЛой, задача, которую я озвучивал уже тут. Есть очень большая таблица, которая через некоторые промежутки времени пересчитывается (обновляется) хранимыми процедурами. Во время таких пересчетов необходимо запретить пользователям любое обращение к этой таблице. Моё решение было такое: Я блокирую совершенно другую таблицу, к которой никто не обращается в принципе, и в рамках одной транзакции делаю пересчёт. Если в этот момент кто-то пытается сделать select, я проверяю заблокирована ли та таблица, если да - пишу пользователю "Подождите некторое время", если нет - разрешаю выполнить запрос.. Как-то так... Всё было бы замечательно, если бы не тормоза при проверке на наличие блокировки таблицы. DIRTY READ не помог :-( Неправильно проверяешь заблокирована ли таблица. 1. Даже если лезть в syslocks, зачем тебе знать все блокировки по таблице? Твой Достаточно знать, есть ли хотя бы одна. Варианты: 1.1. Код: sql 1. 2. 3. 4. 5.
1.1. Код: sql 1. 2. 3. 4. 5.
1.2. Код: sql 1. 2. 3. 4. 5. 6. 7.
Получил одну строку - есть блокировка. Получил 0 строк - нет блокировки. 2. Чтобы узнать, заблокирована ли таблица, достаточно попытаться заблокировать её самому или вставить в неё запись. но 1) с корректным изменением времени ожидания через LOCK MODE TO WAIT перед проверкой и возвратом в рабочий режим после проверки 2) перехватом исключительных ситуаций в Delphi (а лучше - SPL), когда таблица заблокирована... ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2013, 12:19 |
|
sysmaster:syslocks
|
|||
---|---|---|---|
#18+
Пост сорвался. Правильная версия тут: Неправильно проверяешь заблокирована ли таблица. 1. Даже если лезть в syslocks, зачем тебе знать все блокировки по таблице? Твой Достаточно знать, есть ли хотя бы одна. Варианты: 1.1. Код: sql 1. 2. 3. 4. 5.
1.2. Код: sql 1. 2. 3. 4. 5. 6. 7.
Получил одну строку - есть блокировка. Получил 0 строк - нет блокировки. 2. Чтобы узнать, заблокирована ли таблица, достаточно попытаться заблокировать её самому или вставить в неё запись. но 1) с корректным изменением времени ожидания через LOCK MODE TO WAIT перед проверкой и возвратом в рабочий режим после проверки 2) перехватом исключительных ситуаций в Delphi (а лучше - SPL), когда таблица заблокирована... ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2013, 12:31 |
|
sysmaster:syslocks
|
|||
---|---|---|---|
#18+
АнатоЛой2) перехватом исключительных ситуаций в Delphi (а лучше - SPL), когда таблица заблокирована... +100. Рьіть в сторону ON EXCEPTION в SPL. Кроме того, при подходе, которьій заложил ТС, вполне может возникнуть проблема, когда за ничтожно малое время от проверки, до вьіполнения операции, ситуация поменяется. P.S. Нельзя строить логику работьі клиентского приложения на основе системньіх таблиц. Системньіе таблицьі они максимум для админа. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2013, 15:08 |
|
sysmaster:syslocks
|
|||
---|---|---|---|
#18+
DaugavaКроме того, при подходе, которьій заложил ТС, вполне может возникнуть проблема, когда за ничтожно малое время от проверки, до вьіполнения операции, ситуация поменяется. Причём возможна ситуация, когда клиент ещё тянет данные, а процедура начинает их обновлять... Правильные подходы: 1. Проблему на сторону админа 1.1. Процедура: 1.1.1. Перед началом обновления Код: sql 1. 2. 3.
1.1.2. Обновление данных TableForUpdate 1.1.3. Код: sql 1.
1.2. Клиент: Код: sql 1.
1.3. Программист: оценивает объёмы обновления данных 1.4. Админ: настраивает нормальную работу сервака на длинную транзакцию. 2. Если проблема на сторону админна не перебрасывается, но не переживаем, если кто-то кроме "нашего" кода полезет с запросом в TableForUpdate, то: 2.1. Приложение по обновлению данных открывает 2 разные сессии и последовательно выполняет: 2.1.1. В 1-ой Код: sql 1. 2. 3.
2.1.2. Во 2-ой Обновление данных в TableForUpdate 2.1.3. В 1-ой Код: sql 1.
2.2. Клиент: Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2013, 20:25 |
|
|
start [/forum/topic.php?fid=44&msg=38269830&tid=1607053]: |
0ms |
get settings: |
26ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
52ms |
get topic data: |
19ms |
get forum data: |
3ms |
get page messages: |
278ms |
get tp. blocked users: |
2ms |
others: | 310ms |
total: | 711ms |
0 / 0 |