Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Firebird 1.5  (Прочитано 20620 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« : 16-02-2018 16:10 » 

да, именно версия 1.5 , сейчас пока что нельзя сменить )

Но вопрос не в этом, а вот,  чём.

В программе вызывается хранимая процедура (в процедуре, видимо, автоматически используется транзакция, выбираются данные из таблицы N)

Параллельно захожу в ibexpert и меняю одну запись в таблице N (а коммит тут автоматически не делается, надо явно кнопочку жамкнуть для коммита). И пока я кнопку не нажал, программа затыкается в очередном вызове хранимой процедуры. После нажатия коммита в эксперте, программа оживает из блокировки.

Это всё понятно, но тут я задумался - ведь кто-то может в сети вот так напакостить, открыть тем же ibexpert  базу и изменить запись, не нажимая коммит. И привет.

Вопрос: как-то возможно узнать, запущена ли сейчас какая-то транзакция (может, ожидание с таймаутом), чтобы была возможность адекватно реагировать на ситуацию ?

Искал (наверное, плохо искал) в тырнете, но не нашёл, как это отследить
Записан

SCRIBE
Гость
« Ответ #1 : 20-02-2018 15:23 » 

https://firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-transacs-statements.html#fblangref25-transacs-settransac-params
Для MSSql и MySQL работает (dirty read), писать это в самом начале процедуры:
Код: (SQL)
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
Поиграйтесь с этими параметрами, должно помочь.

Если надо реально увидеть локи таблиц, думаю для этого в доках об этом есть соотвественная инфо (системные таблички, etc).
« Последнее редактирование: 20-02-2018 15:27 от ..::SCRIBE::.. » Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 20-02-2018 20:25 » 

На самом деле проблема в подходе к использованию БД. Либо многопользовательская и ограничение на время транзакции, либо это однопользовательская. Все остальное — костыли, ведущие к проблемам. Отсюда лечение: не использовать ibexpert, если эта программа не умеет делать автокоммит.
« Последнее редактирование: 20-02-2018 20:27 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 21-02-2018 05:25 » 

..::SCRIBE::..,

SET TRANSACTION READ ONLY NO WAIT
- пробовал. В этой версии ответ "not permitted"

в таблице RDB$TRANSACTIONS никаких записей не появляется во время блокировки. Или я не туда смотрю всё же ?

RXL, ну это понятно, но всё же интересно, как поймать такую бяку, если вдруг возникнет
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 21-02-2018 06:05 » 


такое движение тоже никакого влияния не оказывает. Лочится на бесконечное время и всё тут )

Код:
CRecordset rs(&base);

base.SetQueryTimeout(2);
rs.Open(CRecordset::snapshot,sql,CRecordset::readOnly);
base.SetQueryTimeout(15);

ладно, спишем на древность СУБД, может и обновлю им как-нибудь
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 05-03-2018 05:34 » 

в общем, в строке подключения было указано
Код:
NOWAIT=N;

Нужно указать
Код:
NOWAIT=Y;

Цитата
N: (wait) The transaction will wait if it encounters a lock conflict.
Y: The transaction will immediately return an error if it encounters a lock conflict.

теперь, если, к примеру, одну запись поменяли (метка времени сменилась), закоммитили, вторую поменяли и "забыли" закоммитить, то очередной запрос не дедлочится, но одну запись выбирает ,
 а вторую, незакоммиченую, понятно, не видит.

Конечно, разбираться, почему где-то кто-то незакоммитил, нужно, но, по крайней мере, программа не превращается в овощ )
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 05-03-2018 07:21 » 

очередной вопрос.

Для мониторинга изменений делаю простейший запрос раз в секунду

Код:
select max(change_id) from LOG where change_id>xxxxxx

change_id новых записей всегда инкременируется
xxxxxx - значение change_id последней считанной записи,

Что меня смущает: постоянный хруст винта (хотя данные не меняются) и монитор ресурсов:


Оранжевая линия - это активность птицы.

Почему идёт ЗАПИСЬ ? Я ведь чтение делаю!

Почему хруст, ведь вроде данные не меняются долгое время, и должен работать кеш винта/птицы - или их нету ? (тут сам отвечу - потому что идёт какая-то запись, а не чтение  А черт его знает... )

Насколько такая постоянная дрючилка для винта опасна? Нужно ли бороться этим ?


Когда запрос не выполняю, птица из монитора исчезает совсем, значит, причина именно в выполнении этого запроса

* firebird15.png (15.31 Кб - загружено 1145 раз.)
« Последнее редактирование: 05-03-2018 07:25 от Алексей++ » Записан

RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 05-03-2018 07:32 » 

При коммите идет запись на диск. Для СУБД это норма. Некоторые СУБД умеют делать отложенную запись транзакций по принципу "ты знаешь, чем рискуешь".

Возможно твой nowait так себя ведет...
« Последнее редактирование: 05-03-2018 07:34 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 05-03-2018 07:54 » 

RXL, я попробовал с  "NOWAIT=N;" тоже - поведение такое же

Добавлено через 12 минут и 38 секунд:
ну, допустим, это "нормальное" поведение СУБД. Как же тогда мониторинг изменений производить ? Или такая нагрузка винту по барабану ? Не обращать внимания ?

Добавлено через 40 минут и 5 секунд:
кстати, попробовал с мускулем - такая же хурма
« Последнее редактирование: 05-03-2018 08:47 от Алексей1153 » Записан

Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 05-03-2018 16:22 » 

Посмотри план запроса, происходит полный скан таблицы, а потом, filesorting

тебе нужен максимальный id автоинкремента, используй для mysql
show

не знаю, что там в птице - думаю, что есть что-то типа describe
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #10 : 06-03-2018 04:45 » 

Sla, в общем случае это у меня там не генератор с автоинкрементом, поле с имитацией времени - при любом редактировании записи заношу utc-шное время в BIGINT (yyyymmddhhmmsszzz). Но по полю есть индекс. Зачем оно там его сканирует, если это индекс ?

Код:
select max(mess_log.message_id) from mess_log

Plan
PLAN (MESS_LOG ORDER PK_MESS_LOG)

Adapted Plan
PLAN (MESS_LOG ORDER PK_MESS_LOG)


хотя, вот тут не сортирует
Код:
select max(OBJECTS.LASTCHANGETIME_UTC) from OBJECTS

Plan
PLAN (OBJECTS NATURAL)

Adapted Plan
PLAN (OBJECTS NATURAL)


может, потому что в MESS_LOG  индекс создан descending. Почему он там так создан - это ещё надо понять, кстати Улыбаюсь




Добавлено через 16 минут и 32 секунды:
Sla, имеешь в виду - стОит заносить циферку последних изменений в генератор и его, генератор, мониторить (то есть, использовать не как генератор, а как переменную-индикатор) ?



Добавлено через 15 минут и 18 секунд:
попробовал
Код:
SELECT GEN_ID(NEW_MESS_ID, 0) FROM RDB$DATABASE;

картина точно такая же. Видимо, особенности версии птицы  А черт его знает...
« Последнее редактирование: 06-03-2018 05:02 от Алексей1153 » Записан

Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 06-03-2018 08:38 » 

Цитата
Но по полю есть индекс. Зачем оно там его сканирует, если это индекс ?

Максимальное значение != максимальному индексу.

Индекс в кешируется, находится в памяти?
Объем индекса?


птицу не знаю, потому ничего сказать не могу

Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #12 : 07-03-2018 04:49 » new

Максимальное значение != максимальному индексу.
в смысле - это про удалённые записи ? Да не было как бы удалённых.

Индекс в кешируется, находится в памяти?
Объем индекса?

кэшируется или нет - не знаю. Как это узнать - тоже не знаю. Объём небольшой, видимо ( в таблице 2500 записей)
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines