|
object TABLE is in use.
|
|||
---|---|---|---|
#18+
Создал отдельную тему для 21663641 . В общем, вчера, после перезапуска базы, удалил две неиспользуемые таблицы. Сегодня утром попытался продолжить удаление и снова: Код: plaintext 1. 2. 3. 4.
Таблицы эти без ВК и прочего - просто таблица с данными. К ней никто не обращается. В MON$STATEMENTS никаких ссылок на удаляемые таблицы нет. В IBExpert'не ничего не делал, значит, это точно не он. То есть кто блокирует - загадка. Влад, ответьте, пожалуйста, на следующие вопросы: 1. После отключения последнего пользователя от базы, все блокировки метаданных просто уничтожаются вместе со снятием блокировки с файла базы? 2. Блокировка связана с коннектом? Я понял, что препарированный запрос живет без транзакции, а если пользователь отключается от базы, не удалив препарированный запрос? 3. Через fb_lock_print можно увидеть, кто держит блокировку таблицы? И отдельный вопрос: 1. Так как используется счетчик, нет возможности узнать, кто конкретно поставил блокировку? Явно известно только в каком коннекте она используется. Чтобы узнать точнее, нужно перебрать все запросы в кеше метаданных данного коннекта. Есть возможность сделать доработку сообщения, которая покажет, в каких коннектах используется таблица? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2018, 08:14 |
|
object TABLE is in use.
|
|||
---|---|---|---|
#18+
Через isql? П.С. Было так, что самописное приложение как-бы вышло (нет в списке задач), но в процессах висело с коннектом к базе. Как версия. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2018, 08:44 |
|
object TABLE is in use.
|
|||
---|---|---|---|
#18+
wadmanЧерез isql? Через isql все работает. Разбираюсь с SQL-монитором в IBExpert. Походу, это таки он виноватый. P.S. Отпишусь еще попозже. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2018, 09:08 |
|
object TABLE is in use.
|
|||
---|---|---|---|
#18+
CyberMax1. После отключения последнего пользователя от базы, все блокировки метаданных просто уничтожаются вместе со снятием блокировки с файла базы? 2. Блокировка связана с коннектом? Я понял, что препарированный запрос живет без транзакции, а если пользователь отключается от базы, не удалив препарированный запрос? 1. Не знаю когда именно снимается блокировака с метаданных. А снятие блокировки файла БД произойдёт, но не факт что сразу. Могут фоновые потоки работать некоторое время. Плюс бывает ещё такая штука как лингер. 2. Препарированный запрос (как и весь кеш метаданных) связан с коннектом, по крайней мере сейчас. По идее препарированные запросы должны умереть сами. >> Есть возможность сделать доработку сообщения, которая покажет, в каких коннектах используется таблица? Как ты себе это представляешь, если будет 500 коннектов? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2018, 09:42 |
|
object TABLE is in use.
|
|||
---|---|---|---|
#18+
Симонов ДенисКак ты себе это представляешь, если будет 500 коннектов? Attachments: 1, 2, 5, 10, 1001, 1004, 50112 and more (total: 500). ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2018, 09:50 |
|
object TABLE is in use.
|
|||
---|---|---|---|
#18+
по мне так лучше сделать специальную таблицу мониторинга в которой будет содержаться все объекты метаданных на которые наложены блокировки. Ну и детализировать это другими таблицами (связанные коннекты, запросы, транзакции). Не знаю насколько это сложно реализовать, но было бы круто ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2018, 09:56 |
|
object TABLE is in use.
|
|||
---|---|---|---|
#18+
CyberMax1. После отключения последнего пользователя от базы, все блокировки метаданных просто уничтожаются вместе со снятием блокировки с файла базы? 2. Блокировка связана с коннектом? Я понял, что препарированный запрос живет без транзакции, а если пользователь отключается от базы, не удалив препарированный запрос? 3. Через fb_lock_print можно увидеть, кто держит блокировку таблицы?1. Если не вдаваться в детали - да. 2. Есть разные виды блокировок. Если говорить о метаданных, то - да, этими блокировками владеет коннект. Препарированные запросы также владеются коннектом и умирают вместе с ним. 3. Да. Но т.к. эта утилита не рассчитана на конечного пользователя, то способ не очевиден и требует некоторых знаний устройства ЛМ. Хотя и весьма прост :) CyberMaxЕсть возможность сделать доработку сообщения, которая покажет, в каких коннектах используется таблица?Я уже говорил, что теоритически возможно многое. На практике есть сложности. В данном случае проще научить пользоваться fb_lock_print'ом :) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2018, 10:09 |
|
object TABLE is in use.
|
|||
---|---|---|---|
#18+
Спасибо за ответы. hvlad2. Есть разные виды блокировок. Если говорить о метаданных, то - да, этими блокировками владеет коннект. Препарированные запросы также владеются коннектом и умирают вместе с ним. А среди разработчиков была мысль или интерес сделать диагностическое сообщение в лог о том, что коннект отключается, не прибрался за собой, то есть остались неуничтоженные объекты, связанные с блокировками метаданных? hvladДа. Но т.к. эта утилита не рассчитана на конечного пользователя, то способ не очевиден и требует некоторых знаний устройства ЛМ. Хотя и весьма прост :) А можете вкратце описать? Я самостоятельно попробую покопать в этом направлении. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2018, 10:20 |
|
object TABLE is in use.
|
|||
---|---|---|---|
#18+
Симонов Дениспо мне так лучше сделать специальную таблицу мониторинга в которой будет содержаться все объекты метаданных на которые наложены блокировки. Ну и детализировать это другими таблицами (связанные коннекты, запросы, транзакции). Не знаю насколько это сложно реализовать, но было бы круто Это да, вообще идеальный вариант. Отпадет сразу куча проблем и вопросов. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2018, 10:21 |
|
object TABLE is in use.
|
|||
---|---|---|---|
#18+
CyberMaxА среди разработчиков была мысль или интерес сделать диагностическое сообщение в лог о том, что коннект отключается, не прибрался за собой, то есть остались неуничтоженные объекты, связанные с блокировками метаданных? Влад вроде ясно сказал, что такого быть не может. Умирающий коннект, убивает так же все объекты, которыми он владеет. Иначе это уже бага в ядре ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2018, 10:29 |
|
object TABLE is in use.
|
|||
---|---|---|---|
#18+
Симонов ДенисВлад вроде ясно сказал, что такого быть не может. Умирающий коннект, убивает так же все объекты, которыми он владеет. Иначе это уже бага в ядре Ты не понял. Коннект, умирая, смотрит, есть ли у него блокировки. И если есть, пишет в лог. По такому принципу работает обнаружение утечек памяти (в EurekaLog и FastMM) - при выходе из приложения проверяется, есть ли неосвобожденные участки памяти. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2018, 10:34 |
|
object TABLE is in use.
|
|||
---|---|---|---|
#18+
Симонов Денис, В руководстве по FB 3.0 про MON$TRANSACTIONS.MON$STATE написано: Состояние транзакции: • 0 — бездействующая; • 1 — активная. Как понимать слово "бездействующая"? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2018, 11:13 |
|
object TABLE is in use.
|
|||
---|---|---|---|
#18+
CyberMax, транзакция в которой нет активных запросов ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2018, 11:18 |
|
object TABLE is in use.
|
|||
---|---|---|---|
#18+
Влад, вопроизвел lock conflict в т.ч. и на isql. Что требуется: 2 подключения. Можно IBExpert, можно isql. 1. Коннект №1. Создаем таблицу: Код: sql 1. 2. 3.
Делаем выборку: Код: sql 1.
Транзакцию не коммиттим. 2. Подключаемся к базе Коннект №2. Удаляем таблицу Код: sql 1.
Получаем исключение: Код: plaintext 1. 2. 3. 4. 5.
3. Мы знаем, что это выполняющийся запрос в Коннекте №1 нам мешает удалить таблицу. Подтверждаем транзакцию у Коннекта №1. Теперь блокировок нет и мы спокойно можем удалить таблицу. 4. В коннекте №2 снова запускаем удаление таблицы: Код: sql 1.
Но сервер не может это сделать: Код: plaintext 1. 2. 3. 4. 5.
Откатываем транзакцию. 5. Пробуем удалить таблицу в коннекте №1. То же самое. Всё, таблицу никто не использует, но удалить ее не можем. 6. Достаточно любому коннекту отключиться и таблицу можно удалить. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2018, 12:10 |
|
object TABLE is in use.
|
|||
---|---|---|---|
#18+
CyberMax, и что? Это ожидаемое поведение для no wait транзакции. Очевидно что ни isql, ни IBE unprepare не делают ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2018, 12:23 |
|
object TABLE is in use.
|
|||
---|---|---|---|
#18+
hvlad2. Есть разные виды блокировок. Если говорить о метаданных, то - да, этими блокировками владеет коннект. Препарированные запросы также владеются коннектом и умирают вместе с ним. А вот тут возникает интересный вопрос: если в коннекте есть препарированный запрос, он владеет SH блокировкой. При попытке в том же коннекте поменять данные, он захочет EX блокировку. Поскольку обе блокировки принадлежат одному коннекту, SH сможет повыситься до EX или будет облом? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2018, 12:27 |
|
object TABLE is in use.
|
|||
---|---|---|---|
#18+
Симонов Дениси что? Это ожидаемое поведение для no wait транзакции. Очевидно что ни isql, ни IBE unprepare не делают Что? Какое unprepare? Про это в документации есть? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2018, 12:48 |
|
object TABLE is in use.
|
|||
---|---|---|---|
#18+
CyberMax, забей. Здесь похоже я ошибаюсь. Жизненный цикл запроса примерно такой: При старте запроса allocate->prepare->execute/open При уничтожении запроса close->unprepare->drop Drop в любом случае проделает все предыдущие этапы. Когда и как это вызывается в этих приложениях я не знаю. Как и не знаю точно как это влияет на препарированные запросы в кеше метаданых, да и на блокировки. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2018, 13:16 |
|
object TABLE is in use.
|
|||
---|---|---|---|
#18+
Симонов Дениси что? Это ожидаемое поведение для no wait транзакции.Именно так Симонов ДенисОчевидно что ни isql, ни IBE unprepare не делаютДело не в unprepare (на самом деле речь об удалении запроса, но не важно). Даже если бы делали - это толко обнулит счётчик ссылок на объект, но не отпустит его блокировку. Дело в том, что в режиме nowait не посылаются сигналы с просьбой отпустить блокировку. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2018, 13:17 |
|
object TABLE is in use.
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovА вот тут возникает интересный вопрос: если в коннекте есть препарированный запрос, он владеет SH блокировкой. При попытке в том же коннекте поменять данные, он захочет EX блокировку.С чего бы это ? Ты путаешь блокировку существования объекта Код: plaintext 1.
и блокировку защиты от изменений Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2018, 13:20 |
|
object TABLE is in use.
|
|||
---|---|---|---|
#18+
Симонов ДенисПри уничтожении запроса close->unprepare->dropПро unprepare. Его ввели в 2.5 по просьбе SAS и убрали в 3 как никому не нужное, iirc. В любом случае - этот вызов не обязателен и не стоит его упоминать. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2018, 13:22 |
|
|
start [/forum/topic.php?fid=40&msg=39698285&tid=1560995]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
84ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 207ms |
0 / 0 |