Гость
Map
Форумы / Informix [игнор отключен] [закрыт для гостей] / sysmaster:syslocks / 10 сообщений из 10, страница 1 из 1
21.05.2013, 17:36
    #38266904
Element2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sysmaster:syslocks
Не понимаю, в чем проблема.
Программно (Delphi, TQuery) пытаюсь определить заблокирована ли таблица:
Код: sql
1.
SELECT tabname FROM sysmaster:syslocks WHERE tabname="Tabl"


и этот запрос у меня или сразу орабатывает или, что чаще, виснет на очень долгое время.
Хотя то же самый запрос из какого-нибудь SQL Explorer'а отрабатывает быстро и на ура..
Не могу понять, в чём причина тормозов запроса через TQuery.
...
Рейтинг: 0 / 0
22.05.2013, 12:50
    #38268141
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sysmaster:syslocks
Element2,
1. TDatabase используешь?
2. при работе с sysmaster "положено" делать SET ISOLATION TO DIRTY READ; перед выполнением запроса.

Скорее всего причина в этом - уровень изоляции через TQuery у тебя не совпадает с уровнем изоляции в других инструментах
...
Рейтинг: 0 / 0
22.05.2013, 12:52
    #38268148
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sysmaster:syslocks
Element2и этот запрос у меня или сразу орабатывает или, что чаще, виснет на очень долгое время.
Хотя то же самый запрос из какого-нибудь SQL Explorer'а отрабатывает быстро и на ура..


вторая возможная причина - количество записей в syslocks может изменяться скачками и на большое количество.
Возможно, ты при запросах "из какого-нибудь SQL Explorer'а" или не точно такой же запрос делаешь, или не в то же время :)
...
Рейтинг: 0 / 0
22.05.2013, 13:33
    #38268215
Element2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sysmaster:syslocks
АнатоЛой,

Да, TDatabase.
Попробую изменить уровень изоляции, может и правда причина в этом. Спасибо.
...
Рейтинг: 0 / 0
22.05.2013, 15:30
    #38268496
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sysmaster:syslocks
Element2, начни с другого. Задача "проверить заблокирована ли таблица".
А для чего?
Есть подозрение, что выбран неправильный метод решения задачи...
...
Рейтинг: 0 / 0
22.05.2013, 17:02
    #38268725
Element2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sysmaster:syslocks
АнатоЛой,

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

Моё решение было такое:
Я блокирую совершенно другую таблицу, к которой никто не обращается в принципе, и в рамках одной транзакции делаю пересчёт.
Если в этот момент кто-то пытается сделать select, я проверяю заблокирована ли та таблица, если да - пишу пользователю "Подождите некторое время", если нет - разрешаю выполнить запрос.. Как-то так...
Всё было бы замечательно, если бы не тормоза при проверке на наличие блокировки таблицы.
DIRTY READ не помог :-(
...
Рейтинг: 0 / 0
23.05.2013, 12:19
    #38269798
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sysmaster:syslocks
Element2АнатоЛой,

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

Моё решение было такое:
Я блокирую совершенно другую таблицу, к которой никто не обращается в принципе, и в рамках одной транзакции делаю пересчёт.
Если в этот момент кто-то пытается сделать select, я проверяю заблокирована ли та таблица, если да - пишу пользователю "Подождите некторое время", если нет - разрешаю выполнить запрос.. Как-то так...
Всё было бы замечательно, если бы не тормоза при проверке на наличие блокировки таблицы.
DIRTY READ не помог :-(
Неправильно проверяешь заблокирована ли таблица.
1. Даже если лезть в syslocks, зачем тебе знать все блокировки по таблице?
Твой
Достаточно знать, есть ли хотя бы одна.
Варианты:
1.1.

Код: sql
1.
2.
3.
4.
5.
SELECT 
    FIRST 1 {+ FIRST_ROWS}
    tabname
  FROM sysmaster:syslocks l
    WHERE l.tabname=t.tabname)



1.1.

Код: sql
1.
2.
3.
4.
5.
SELECT 
    FIRST 1 {+ FIRST_ROWS}
    tabname
  FROM sysmaster:syslocks l
    WHERE l.tabname=t.tabname)



1.2.
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT t.tabname 
  FROM sysmaster:systables  t
    WHERE t.tabname="Tabl"
        AND EXISTS(
                  SELECT tabname
                     FROM sysmaster:syslocks l
                         WHERE l.tabname=t.tabname)


Получил одну строку - есть блокировка.
Получил 0 строк - нет блокировки.

2. Чтобы узнать, заблокирована ли таблица, достаточно попытаться заблокировать её самому или вставить в неё запись.
но
1) с корректным изменением времени ожидания через LOCK MODE TO WAIT перед проверкой и возвратом в рабочий режим после проверки
2) перехватом исключительных ситуаций в Delphi (а лучше - SPL), когда таблица заблокирована...
...
Рейтинг: 0 / 0
23.05.2013, 12:31
    #38269830
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sysmaster:syslocks
Пост сорвался.
Правильная версия тут:

Неправильно проверяешь заблокирована ли таблица.
1. Даже если лезть в syslocks, зачем тебе знать все блокировки по таблице?
Твой
Достаточно знать, есть ли хотя бы одна.
Варианты:
1.1.

Код: sql
1.
2.
3.
4.
5.
SELECT 
    FIRST 1 {+ FIRST_ROWS}
    tabname
  FROM sysmaster:syslocks l
    WHERE l.tabname="Tabl"



1.2.
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT t.tabname 
  FROM sysmaster:systables  t
    WHERE t.tabname="Tabl"
        AND EXISTS(
                  SELECT tabname
                     FROM sysmaster:syslocks l
                         WHERE l.tabname=t.tabname)


Получил одну строку - есть блокировка.
Получил 0 строк - нет блокировки.

2. Чтобы узнать, заблокирована ли таблица, достаточно попытаться заблокировать её самому или вставить в неё запись.
но
1) с корректным изменением времени ожидания через LOCK MODE TO WAIT перед проверкой и возвратом в рабочий режим после проверки
2) перехватом исключительных ситуаций в Delphi (а лучше - SPL), когда таблица заблокирована...
...
Рейтинг: 0 / 0
23.05.2013, 15:08
    #38270213
Daugava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sysmaster:syslocks
АнатоЛой2) перехватом исключительных ситуаций в Delphi (а лучше - SPL), когда таблица заблокирована...
+100. Рьіть в сторону ON EXCEPTION в SPL.

Кроме того, при подходе, которьій заложил ТС, вполне может возникнуть проблема, когда за ничтожно малое время от проверки, до вьіполнения операции, ситуация поменяется.

P.S. Нельзя строить логику работьі клиентского приложения на основе системньіх таблиц. Системньіе таблицьі они максимум для админа.
...
Рейтинг: 0 / 0
23.05.2013, 20:25
    #38270839
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sysmaster:syslocks
DaugavaКроме того, при подходе, которьій заложил ТС, вполне может возникнуть проблема, когда за ничтожно малое время от проверки, до вьіполнения операции, ситуация поменяется.

Причём возможна ситуация, когда клиент ещё тянет данные, а процедура начинает их обновлять...

Правильные подходы:
1. Проблему на сторону админа

1.1. Процедура:
1.1.1. Перед началом обновления
Код: sql
1.
2.
3.
   SET LOCK MODE TO WAIT 15;
   BEGIN WORK; -- как я понимаю база транзакционная
   LOCK TABLE TableForUpdate IN EXCLUSIVE MODE; - с перехватом exception пока не сработает.



1.1.2. Обновление данных TableForUpdate
1.1.3.
Код: sql
1.
  COMMIT WORK;


1.2. Клиент:
Код: sql
1.
  SELECT FROM TableForUpdate, надеюсь, обрамлённый перехватом exception c анализом кода ошибки и выдачи корректных сообщений.


1.3. Программист: оценивает объёмы обновления данных

1.4. Админ: настраивает нормальную работу сервака на длинную транзакцию.

2. Если проблема на сторону админна не перебрасывается,
но не переживаем, если кто-то кроме "нашего" кода полезет с запросом в TableForUpdate, то:

2.1. Приложение по обновлению данных открывает 2 разные сессии и последовательно выполняет:
2.1.1. В 1-ой
Код: sql
1.
2.
3.
   SET LOCK MODE TO WAIT 30;
   BEGIN WORK; 
   LOCK TABLE TableMutex IN EXCLUSIVE MODE; - пока LOCK не сработает.



2.1.2. Во 2-ой
Обновление данных в TableForUpdate
2.1.3. В 1-ой
Код: sql
1.
    COMMIT WORK;


2.2. Клиент:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
   SET LOCK MODE TO WAIT 5;
   BEGIN WORK; 

   LOCK TABLE TableMutex IN SHARE MODE; + обработка exception

   SELECT FROM TableForUpdate

   COMMIT WORK;
...
Рейтинг: 0 / 0
Форумы / Informix [игнор отключен] [закрыт для гостей] / sysmaster:syslocks / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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