Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« : 16-02-2018 16:10 » |
|
да, именно версия 1.5 , сейчас пока что нельзя сменить )
Но вопрос не в этом, а вот, чём.
В программе вызывается хранимая процедура (в процедуре, видимо, автоматически используется транзакция, выбираются данные из таблицы N)
Параллельно захожу в ibexpert и меняю одну запись в таблице N (а коммит тут автоматически не делается, надо явно кнопочку жамкнуть для коммита). И пока я кнопку не нажал, программа затыкается в очередном вызове хранимой процедуры. После нажатия коммита в эксперте, программа оживает из блокировки.
Это всё понятно, но тут я задумался - ведь кто-то может в сети вот так напакостить, открыть тем же ibexpert базу и изменить запись, не нажимая коммит. И привет.
Вопрос: как-то возможно узнать, запущена ли сейчас какая-то транзакция (может, ожидание с таймаутом), чтобы была возможность адекватно реагировать на ситуацию ?
Искал (наверное, плохо искал) в тырнете, но не нашёл, как это отследить
|
|
|
Записан
|
|
|
|
|
RXL
|
|
« Ответ #2 : 20-02-2018 20:25 » |
|
На самом деле проблема в подходе к использованию БД. Либо многопользовательская и ограничение на время транзакции, либо это однопользовательская. Все остальное — костыли, ведущие к проблемам. Отсюда лечение: не использовать ibexpert, если эта программа не умеет делать автокоммит.
|
|
« Последнее редактирование: 20-02-2018 20:27 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #3 : 21-02-2018 05:25 » |
|
..::SCRIBE::..,
SET TRANSACTION READ ONLY NO WAIT - пробовал. В этой версии ответ "not permitted"
в таблице RDB$TRANSACTIONS никаких записей не появляется во время блокировки. Или я не туда смотрю всё же ?
RXL, ну это понятно, но всё же интересно, как поймать такую бяку, если вдруг возникнет
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #4 : 21-02-2018 06:05 » |
|
такое движение тоже никакого влияния не оказывает. Лочится на бесконечное время и всё тут ) CRecordset rs(&base);
base.SetQueryTimeout(2); rs.Open(CRecordset::snapshot,sql,CRecordset::readOnly); base.SetQueryTimeout(15);
ладно, спишем на древность СУБД, может и обновлю им как-нибудь
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #5 : 05-03-2018 05:34 » |
|
в общем, в строке подключения было указано Нужно указать 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.
теперь, если, к примеру, одну запись поменяли (метка времени сменилась), закоммитили, вторую поменяли и "забыли" закоммитить, то очередной запрос не дедлочится, но одну запись выбирает , а вторую, незакоммиченую, понятно, не видит. Конечно, разбираться, почему где-то кто-то незакоммитил, нужно, но, по крайней мере, программа не превращается в овощ )
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #6 : 05-03-2018 07:21 » |
|
очередной вопрос. Для мониторинга изменений делаю простейший запрос раз в секунду select max(change_id) from LOG where change_id>xxxxxx change_id новых записей всегда инкременируется xxxxxx - значение change_id последней считанной записи, Что меня смущает: постоянный хруст винта (хотя данные не меняются) и монитор ресурсов: Оранжевая линия - это активность птицы. Почему идёт ЗАПИСЬ ? Я ведь чтение делаю! Почему хруст, ведь вроде данные не меняются долгое время, и должен работать кеш винта/птицы - или их нету ? (тут сам отвечу - потому что идёт какая-то запись, а не чтение ) Насколько такая постоянная дрючилка для винта опасна? Нужно ли бороться этим ? Когда запрос не выполняю, птица из монитора исчезает совсем, значит, причина именно в выполнении этого запроса
|
|
« Последнее редактирование: 05-03-2018 07:25 от Алексей++ »
|
Записан
|
|
|
|
RXL
|
|
« Ответ #7 : 05-03-2018 07:32 » |
|
При коммите идет запись на диск. Для СУБД это норма. Некоторые СУБД умеют делать отложенную запись транзакций по принципу "ты знаешь, чем рискуешь".
Возможно твой nowait так себя ведет...
|
|
« Последнее редактирование: 05-03-2018 07:34 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #8 : 05-03-2018 07:54 » |
|
RXL, я попробовал с "NOWAIT=N;" тоже - поведение такое же
Добавлено через 12 минут и 38 секунд: ну, допустим, это "нормальное" поведение СУБД. Как же тогда мониторинг изменений производить ? Или такая нагрузка винту по барабану ? Не обращать внимания ?
Добавлено через 40 минут и 5 секунд: кстати, попробовал с мускулем - такая же хурма
|
|
« Последнее редактирование: 05-03-2018 08:47 от Алексей1153 »
|
Записан
|
|
|
|
Sla
|
|
« Ответ #9 : 05-03-2018 16:22 » |
|
Посмотри план запроса, происходит полный скан таблицы, а потом, filesorting
тебе нужен максимальный id автоинкремента, используй для mysql show
не знаю, что там в птице - думаю, что есть что-то типа describe
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
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
|
|
« Ответ #11 : 06-03-2018 08:38 » |
|
Но по полю есть индекс. Зачем оно там его сканирует, если это индекс ? Максимальное значение != максимальному индексу. Индекс в кешируется, находится в памяти? Объем индекса? птицу не знаю, потому ничего сказать не могу
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #12 : 07-03-2018 04:49 » |
|
Максимальное значение != максимальному индексу.
в смысле - это про удалённые записи ? Да не было как бы удалённых. Индекс в кешируется, находится в памяти? Объем индекса?
кэшируется или нет - не знаю. Как это узнать - тоже не знаю. Объём небольшой, видимо ( в таблице 2500 записей)
|
|
|
Записан
|
|
|
|
|