|
|
|
Понимание результатов fb_lock_print
|
|||
|---|---|---|---|
|
#18+
dimitrТаблоидя всё равно НЕ получу никакой инфы о номере транзакции / коннекта, который не даёт добавить строку в detail-таблицу?для NOWAIT транзакции есс-но не получишь, ибо не сможешь в ЛТ найти ожидающий коннект. Для WAIT - номер коннекта найдешь при желании.Хорошо, вот пример с WAIT. Новая база, таблица t(id int, f01 int); В таблицу добавлена единственная строка: id=1, f01=1, после чего выполнен quit. Затем: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. В этот момент была снята ЛТ: Код: plaintext Допустим, надо понять, кто не даёт второму коннекту проапдейтить строку. В лок-таблице ищем строку с pending: NNNNN, где NNNNN > 0. Такой блок - один (в данной ситуации): Код: plaintext 1. 2. 3. 4. 5. Если теперь поискать строку вида 'BLOCK 216240", то мы выходим на вот это: Код: plaintext 1. 2. 3. 4. 5. То, что в этом блоке записано "Owner: 215480", подсказывает очевидное: мы нашли нечто, что хотел заблокировать зависший коннект с id=215480. А хотел он залочить объект с id = 214264. Ищем далее строку "BLOCK 214264" и находим её тут: Код: plaintext 1. 2. 3. 4. 5. 6. Отлично. Ищем теперь строку "OWNER BLOCK 212936". Находим этот блок в самом начале ЛТ: Код: plaintext 1. 2. 3. 4. 5. 6. Номер коннекта (который равен 6 - см выше), номер транзакции - в где они тут ? С другой стороны, в mon$statements видим (с третьего окна): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. В общем, я так и не понял, как в ЛТ найти транзакцию-"держиморду", которая не даёт развиваться остальным. Что в wait-режиме, что без него. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2013, 12:58:18 |
|
||
|
Понимание результатов fb_lock_print
|
|||
|---|---|---|---|
|
#18+
ищи лок с series = LCK_attachment, у которого будет всего один owner = 212936. Это LOCK BLOCK 214080. Его key равен номеру коннекта. С транзакцией сложнее, т.к. она напрямую с локом не связана. Если ожидание именно на записи, то смотри key у конфликтного лока 214264. Либо просто ищи все тр-ции данного овнера по вышесказанному алгоритму, только для series = LCK_tra. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2013, 13:29:19 |
|
||
|
Понимание результатов fb_lock_print
|
|||
|---|---|---|---|
|
#18+
dimitrищи лок с series = LCK_attachment, у которого будет всего один owner = 212936. Это LOCK BLOCK 214080. Его key равен номеру коннекта. С транзакцией сложнее, т.к. она напрямую с локом не связана. Если ожидание именно на записи, то смотри key у конфликтного лока 214264. Либо просто ищи все тр-ции данного овнера по вышесказанному алгоритму, только для series = LCK_tra.Нашёл, псип. Вот они, коннекты (6 и 8 для данного примера): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ЗЫ. Соответствие номеров серий их мнемоникам вытащу сюда, чтобы в дальнейшем не рыскать по сырцам. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2013, 13:39:00 |
|
||
|
Понимание результатов fb_lock_print
|
|||
|---|---|---|---|
|
#18+
ТаблоидСоответствие номеров серий их мнемоникам вытащу сюдаХм... а почему в этом списке нет краткосрочных блокировок (латчей ?), которые ставятся на страницы при их считывании ? (например, при получении gen_id, да и вообще при получении содержимого любой записи) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2013, 15:21:17 |
|
||
|
Понимание результатов fb_lock_print
|
|||
|---|---|---|---|
|
#18+
страничные локи - это LCK_bdb. Страничные латчи - это несколько другое и не относится к ЛМ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2013, 18:18:26 |
|
||
|
Понимание результатов fb_lock_print
|
|||
|---|---|---|---|
|
#18+
dimitrстраничные локи - это LCK_bdb. Страничные латчи - это несколько другое и не относится к ЛМ.LCK_bdb - это блокировка, для которой Series = 3 (я выше вытряхнул из lck.h соотв-щее перечисление). Тогда вышеприведенного примера и снимка ЛТ (файл выше в аттаче) получается 66(!) блокировок страниц: Код: plaintext 1. Если посмотреть на эти lock block'и, то увидим, только одна страница схвачена в режиме exclusive ( state=6 ), а все остальные - в режиме protected read (state=3): Код: plaintext 1. 2. 3. 4. 5. 6. Про protected read догадываюсь: это блокировки метаданных, чтобы никто таблицу `t` не дропнул. Но про последнюю, exclusive-блокировку: Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2013, 19:26:30 |
|
||
|
Понимание результатов fb_lock_print
|
|||
|---|---|---|---|
|
#18+
dimitrСтраничные латчи - это несколько другое и не относится к ЛМ.Если так, то существует ли механизм определения времени, затрачиваемого на получение этих латчей, скажем, при выполнении какого-нибудь сверхтяжкого селекта ? Т.е. вот идёт селект, ему надо прочесть огромное число страниц базы (не говоря уже про число строк таблиц!). Он запрашивает латчи на чтение каждой страницы, затем "отпускает" страницу и идёт дальше. Сколько времени у него уходит на это - как определить ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2013, 19:31:50 |
|
||
|
Понимание результатов fb_lock_print
|
|||
|---|---|---|---|
|
#18+
ТаблоидСколько времени у него уходит на это - как определить ? никак. Но в твоем случае пофиг, ибо за латчи в SC/CS практически нет конкуренции. Они свои в каждом экземпляре кеша. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2013, 20:43:58 |
|
||
|
Понимание результатов fb_lock_print
|
|||
|---|---|---|---|
|
#18+
Таблоидимею вопрос: страница базы номер 170, затолканная в hash-гнездо номер 1, сейчас заблокирована "вусмерть", т.е. её нельзя даже прочитать . Это так ? не так. Этот лок просто кеширован коннектом. Когда кто-либо еще будет брать эту страницу, лок отпустится по АСТу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2013, 20:45:16 |
|
||
|
Понимание результатов fb_lock_print
|
|||
|---|---|---|---|
|
#18+
Очередной вопросик возник. Создал базу, page_size = 16K, в ней - табличку: Код: sql 1. 2. 3. 4. Дальше отсоединился и выполнил b/r. Таблица с двумя записями, очевидно, влезла в одну страницу базы: gstat -r Код: plaintext 1. 2. 3. 4. 5. 6. 7. Затем запускаю два isql окошка и в каждом них делаю апдейты строк без lock conflict'ов: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Код: plaintext Если я правильно понимаю, снимок ЛТ должен содержать множество lock block'ов с сериями = 3 (это LCK_bdb - Individual buffer block). Причём, та единственная страница базы, в которой живут две записи таблицы `T`, должна встречаться в двух lock block'ах - ведь два коннекта держут "свои" блокировки записей, которые живут на этой самой странице. И в каждом из этих лок-блоков должны быть блокировки уровня shared write, что соответствует "state: 4". Я не вижу в упор, где это в ЛТ (она в аттаче). Ибо команда поиска: Код: plaintext findstr result Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2013, 00:16:58 |
|
||
|
Понимание результатов fb_lock_print
|
|||
|---|---|---|---|
|
#18+
Таблоиддва коннекта держут "свои" блокировки записей Ничего они не держут. Заблокировали что нужно, сделали своё грязное дело и давно уже блокировки отпустили так, что ты и глазом моргнуть не успел. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2013, 00:26:45 |
|
||
|
Понимание результатов fb_lock_print
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovНичего они не держут. Заблокировали что нужно, сделали своё грязное дело и давно уже блокировки отпустили так, что ты и глазом моргнуть не успел.Это как это ?! а "кто" тогда мешает третьему коннекту проапдейтить эти же строки ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2013, 00:28:22 |
|
||
|
Понимание результатов fb_lock_print
|
|||
|---|---|---|---|
|
#18+
Таблоида "кто" тогда мешает третьему коннекту проапдейтить эти же строки ? Совесть. Он видит наличие незакоммиченных версий. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2013, 00:46:40 |
|
||
|
Понимание результатов fb_lock_print
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovОн видит наличие незакоммиченных версий.Этого мало. Он также должен видеть, живые ли соотв-щие транзакции. Тогда получается, что составить картину типа "Кто чего сейчас держит заблокированным" практически нереально: надо пройтись по всем незакоммиченным версиям и попробовать "тихо" их залочить, чтобы понять, живы ли соотв-щие транзакции - владельцы блокировок, а затем "разлочить". Этот процесс будет выполняться долго и всё загнётся. Я прав в своей догадке ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2013, 00:57:59 |
|
||
|
Понимание результатов fb_lock_print
|
|||
|---|---|---|---|
|
#18+
ТаблоидОн также должен видеть, живые ли соотв-щие транзакции. А для этого у него есть TIP и возможность послать сигнал "есть кто живой" другой транзакции. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2013, 01:09:36 |
|
||
|
Понимание результатов fb_lock_print
|
|||
|---|---|---|---|
|
#18+
ТаблоидПричём, та единственная страница базы, в которой живут две записи таблицы `T`, должна встречаться в двух lock block'ахНет, ибо страница - одна, значит и блокировка у неё тоже одна. Вот request'ов может быть много. А lock - один. Таблоидведь два коннекта держут "свои" блокировки записейНет никаких блокировок записей. НЕТ ИХ. Таблоидблокировки уровня shared writeНет конечно. События происходили примерно так: 1. первый коннект собирается читать страницу с данными и просит SR блокировку - блокировка получена, можно читать страницу 2. первый коннект собирается менять страницу с данными и просит PW блокировку - блокировка получена, можно менять страницу - старая SR при этом отпускается 3. второй коннект собирается читать с данными и просит SR блокировку - первый коннект получает сигнал и отпускает свою PW блокировку, при этом он пишет страницу на диск - второй коннект получает SR блокировку и читает страницу с диска 4. второй коннект собирается менять страницу с данными и просит PW блокировку ... Итого: у последнего писателя есть PW блокировка, у остальных - нет никаких блокировок этой страницы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2013, 02:16:44 |
|
||
|
Понимание результатов fb_lock_print
|
|||
|---|---|---|---|
|
#18+
Чтобы ещё больше запутать Таблоида, уточню - то, что движок считает блокировками, на самом деле лишь запросы на блокировки. Т.е. в лок-менеджере им соответствуют REQUEST'ы. Есть две основные сущности - владельцы ресурсов (OWNER'ы) и собственно ресурсы, точнее их блокировки (LOCK'и). Владельцы делают запросы (REQUEST'ы) на владение ресурсами. Можно сказать, что владельцы и ресурсы связаны как M:N посредством запросов. С точки зрения владельца его список запросов есть список ресурсов которыми он владеет или хочет овладеть. С точки зрения ресурса, его список запросов можно разделить на две части: - удовлетворённые запросы (их владельцы совместно владеют ресурсом), и - ожидающие запросы (их владельцы хотят получить доступ, несовместимый с доступом первой группы) Например, из твоего файла: Код: plaintext 1. 2. 3. 4. 5. 6. 7. Её состояние - PR (State: 3). Ею владеют 2 владельца (18744, 20992) А вот совсем другая блокировка Код: plaintext 1. 2. 3. 4. 5. 6. Её состояние - EX (State: 6). Ею безраздельно владеет владелец 20992 PS в предыдущем посте читать вместо SR и PW соответственно PR и EX ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2013, 02:31:58 |
|
||
|
Понимание результатов fb_lock_print
|
|||
|---|---|---|---|
|
#18+
С учетом вот этой фразы:hvladчитать вместо SR и PW соответственно PR и EX- подправил тот текст и получаю:hvladСобытия происходили примерно так: 1. первый коннект собирается читать страницу с данными и просит SR Protected Read блокировку - блокировка получена, можно читать страницу 2. первый коннект собирается менять страницу с данными и просит PW Exclusive блокировку - блокировка получена, можно менять страницу - старая SR при этом отпускается ВОПРОС-1. Первый коннект выдал команду UPDATE, смысл которой - поменять содержимое страницы. Да, понятно, что сначала надо найти эту страницу. Но почему нельзя после её нахождения сразу поставить exclusive-блокировку, без промежуточной PR ? И почему, кстати, нужна именно EX, разве Protected Write не будет достаточной ? (страница ведь обновляется целиком, никаких там "частичных записей" со 153-его по 234-й байт нету ==> никто не сможет прочитать её в "несогласованном" виде. Или не так ?) И еще вопрос.hvlad Код: plaintext 1. 2. 3. 4. 5. 6. Это блокировка страницы (Series: 3) с номером 143 . Её состояние - PR (State: 3). Там еще десятки аналогичных лок-блоков: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. Все они в том же самом Protected Read, т.е. эти страницы (..., 79, 80, 81, ...) сейчас можно читать, но в них нельзя записывать. ВОПРОС-2. Что это за страницы ? Как понять, к какому объекту базы они относятся ? В gstat'e по пользовательским таблицам нет инфы о номерах страниц, а rdb$-таблицы так вообще не отображаются никак. hvlad3. второй коннект собирается читать с данными и просит Protected Read SR блокировку - первый коннект получает сигнал и отпускает свою Exclusive PW блокировку, при этом он пишет страницу на диск - второй коннект получает Protected Read SR блокировку и читает страницу с диска ВОПРОС-3. По каким правилам owner-"А", получивший сигнал "отпусти ресурс!" от owner'a-"Б", решает, можно ли это делать ? Или он делает это всегда, а уж owner-"Б" должен сам позаботиться о сохранности изменений owner'a-"A" ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2013, 11:21:23 |
|
||
|
Понимание результатов fb_lock_print
|
|||
|---|---|---|---|
|
#18+
Таблоид ВОПРОС-1. Первый коннект выдал команду UPDATE, смысл которой - поменять содержимое страницы. Да, понятно, что сначала надо найти эту страницу. Но почему нельзя после её нахождения сразу поставить exclusive-блокировку, без промежуточной PR ? потому что update "изнутри" - это а-ля for select + update where current of. Нафига лочить страницу на запись, если предикат может оказаться ложным и мы запись не будем менять? Но иногда таки ставится сразу EX еще при чтении, если оптимизатор сочтет это более удачным. Это экономит конверсию лока. ТаблоидИ почему, кстати, нужна именно EX, разве Protected Write не будет достаточной ? в случае страничных блокировок монопенисуально, т.к. поведение читателей от этого никак не изменится ТаблоидОни отличаются только номерами внутри хеш-гнёзда ("0001:000NNN") 0001 - это не хеш-гнездо, а номер page space Таблоид ВОПРОС-2. Что это за страницы ? Как понять, к какому объекту базы они относятся ? никак (без отладчика) Таблоид ВОПРОС-3. По каким правилам owner-"А", получивший сигнал "отпусти ресурс!" от owner'a-"Б", решает, можно ли это делать ? Или он делает это всегда, а уж owner-"Б" должен сам позаботиться о сохранности изменений owner'a-"A" ? всегда, при условии что owner A в данный момент не меняет страницу. Если меняет - то отпустит "как только так сразу". О сохранности заботится owner A, записывая измененную страницу на диск - читай ответ Влада внимательнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2013, 13:05:50 |
|
||
|
Понимание результатов fb_lock_print
|
|||
|---|---|---|---|
|
#18+
ТаблоидВ gstat'e по пользовательским таблицам нет инфы о номерах страниц IBSurgeonViewer покажет. правда, не на "живой" базе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2013, 13:14:25 |
|
||
|
Понимание результатов fb_lock_print
|
|||
|---|---|---|---|
|
#18+
dimitrНафига лочить страницу на запись, если предикат может оказаться ложным и мы запись не будем менять?Ну так мы всё равно её лочим, только в режиме protected read. К тому же, предикат окажется ложным после получения protected read-блокировки только в случае, когда эта же запись подверглась модификации другой транзакцией оно ? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Почему нельзя так: 1) запрашиваем страницу 123 в режиме protected write 2) получили, проверяем предикат 3) предикат не изменился ==> сразу же меняем содержимое, без затрат на повышение блокировки 4) предикат изменился ==> отвал. Ы ? dimitr0001 - это не хеш-гнездо, а номер page spaceЧто это за "единица измерения", в где-то про неё написано ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2013, 13:27:19 |
|
||
|
Понимание результатов fb_lock_print
|
|||
|---|---|---|---|
|
#18+
ТаблоидНу так мы всё равно её лочим, только в режиме protected read. это не мешает остальным коннектам ее читать в этот момент, в отличие от ТаблоидК тому же, предикат окажется ложным после получения protected read-блокировки только в случае, когда эта же запись подверглась модификации другой транзакцией серверу глубоко фиолетово, какой именно у тебя предикат. Может там условие 1=0. Тоже лочить все страницы на запись? ТаблоидПочему нельзя так потому что фигню написал. Я не знаю что такое "предикат изменился". ТаблоидЧто это за "единица измерения", в где-то про неё написано ? оно тебе не надо. Это область со своей нумерацией страниц. В первом приближении это файл. Для основной базы это всегда 1, для GTT - ID экземпляра данных (временного файла). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2013, 13:52:30 |
|
||
|
Понимание результатов fb_lock_print
|
|||
|---|---|---|---|
|
#18+
kdvIBSurgeonViewer покажет. правда, не на "живой" базе.Дык интересуют именно возможности анализа ЛТ живой базы, на которой юзера лбами сталкиваются :-) Впрочем, любопытная штука, спасибо. Только и по ней непонятка есть - см иллюстр. ЗЫ. Этот вьювер развивается или нет ? там указан 2004-й год... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2013, 13:53:21 |
|
||
|
Понимание результатов fb_lock_print
|
|||
|---|---|---|---|
|
#18+
ТаблоидНу так мы всё равно её лочим, только в режиме protected read.Ты разницу между shared и exclusive понимаешь ? А то, что кроме тебя, эту страницу могут хотеть прочитать ещё 100500 коннектов - тоже понимаешь ? ТаблоидК тому же, предикат окажется ложным после получения protected read-блокировки только в случае, когда эта же запись подверглась модификации другой транзакциейУ тебя всегда и везде доступ только по ПК ? Вот откуда эта категоричность ? ТаблоидНе так уж часто сиё бываетВ конкурентной среде записи могут меняться гораздо быстрее, чем ты себе можешь представить. ТаблоидПочему нельзя такДмитрий выше написал, что так иногда делается. ТаблоидЧто это за "единица измерения", в где-то про неё написано ?Это не есть инф-ция для конечного пользователя. Посему - кому надо, те и так знают. PageSpace ввели для реализации GTT. В данный момент есть PageSpace = 1, в которой учитываются страницы основной БД, и все остальные PageSpace, в которых живут данные GTT. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2013, 14:02:27 |
|
||
|
Понимание результатов fb_lock_print
|
|||
|---|---|---|---|
|
#18+
dimitrэто не мешает остальным коннектам ее читать в этот момент, в отличие отhvladТаблоидНу так мы всё равно её лочим, только в режиме protected read.Ты разницу между shared и exclusive понимаешь ? А то, что кроме тебя, эту страницу могут хотеть прочитать ещё 100500 коннектов - тоже понимаешь ?я всё это понимаю. Поэтому про exclusive и не говорил ни разу. Наоборот, заменить её хотел на PW :-) А спрашивал про protected write , которая запрещает другим писать, но НЕ запрещает читать. hvladУ тебя всегда и везде доступ только по ПК ? Вот откуда эта категоричность ?Нет, конечно. Но причём тут вид доступа ? ЗЫ. Табличка в Книге про совместимость блокировок - пущай тут тоже будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2013, 14:15:48 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=38126168&tid=1564097]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
205ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 195ms |
| total: | 478ms |

| 0 / 0 |
