Здравствуйте, Qt-Coder, Вы писали: QC>Подскажите в чем может быть дело? На каком ресурсе оно блокируется?
Вроде oracle в таких случаях dump сохраняет, где есть rowid-ы.
QC>Условие WHERE для каждого потока уникально. То есть нет такого, чтобы 2 потока обновляли одну и ту же пару F1+F2.
значит это не взаимоблокировка
QC>Однако периодически прилетает ORA-00600 взаимная блокировка.
QC>Подскажите в чем может быть дело? На каком ресурсе оно блокируется?
ORA-600 это не взаимоблокировка, а внутренняя ошибка. зачастую какой-то баг в оракле или блок попрочен у таблички. там после ora-600 в квадратных скобках идут параметры, вбивай в гугл ошибку и ищи на какую тему твой ora-600. много лет назад помню на металинке была страничка где можно было вбивать параметры, а металинк расказывал в чем дело и что делать.
QC>>Условие WHERE для каждого потока уникально. То есть нет такого, чтобы 2 потока обновляли одну и ту же пару F1+F2.
Gt_>значит это не взаимоблокировка
QC>>Однако периодически прилетает ORA-00600 взаимная блокировка.
QC>>Подскажите в чем может быть дело? На каком ресурсе оно блокируется?
Gt_>ORA-600 это не взаимоблокировка, а внутренняя ошибка. зачастую какой-то баг в оракле или блок попрочен у таблички. там после ora-600 в квадратных скобках идут параметры, вбивай в гугл ошибку и ищи на какую тему твой ora-600. много лет назад помню на металинке была страничка где можно было вбивать параметры, а металинк расказывал в чем дело и что делать.
Gt_>Gt_
Как правило сообщение об ошибке выглядит так
ORA-24381: ошибка(и) в массиве DML
ORA-00060: взаимная блокировка при ожидании ресурса
ORA-00060: взаимная блокировка при ожидании ресурса
ORA-00060: взаимная блокировка при ожидании ресурса
ORA-00060: взаимная блокировка при ожидании ресурса
ORA-00060: взаимная блокировка при ожидании ресурса
ORA-00060 повторяется по количеству заблокированных строк, видимо.
Здравствуйте, Qt-Coder, Вы писали:
QC>Каждый поток начинает транзацкцию, выполняет update пачкой
Я давно в базах не возился, но смутно помню, что есть такое "lock escalation" — когда субд решает, что делать row lock для "слишком много" отдельных строк в данной транзации — накладно и пытается сделать table lock.
Оно?..
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
QC>Как правило сообщение об ошибке выглядит так QC>
QC>ORA-24381: ошибка(и) в массиве DML
QC>ORA-00060: взаимная блокировка при ожидании ресурса
QC>ORA-00060: взаимная блокировка при ожидании ресурса
QC>ORA-00060: взаимная блокировка при ожидании ресурса
QC>ORA-00060: взаимная блокировка при ожидании ресурса
QC>ORA-00060: взаимная блокировка при ожидании ресурса
QC>
QC>ORA-00060 повторяется по количеству заблокированных строк, видимо.
если в самом деле ORA-00060, то "Условие WHERE для каждого потока уникально. То есть нет такого, чтобы 2 потока обновляли одну и ту же пару F1+F2." вранье. оракл блокирует исключительно на уровне строк, если потоки апдейтят разные строки, то вылететь с deadlock у них шансов не было бы.
Здравствуйте, ·, Вы писали:
·>Здравствуйте, Qt-Coder, Вы писали:
QC>>Каждый поток начинает транзацкцию, выполняет update пачкой ·>Я давно в базах не возился, но смутно помню, что есть такое "lock escalation" — когда субд решает, что делать row lock для "слишком много" отдельных строк в данной транзации — накладно и пытается сделать table lock. ·>Оно?..
Возможно, но тогда бы блочилась вся пачка при update (это примерно 1000 записей), а не несколько строк из пачки.
Здравствуйте, ·, Вы писали:
·>Здравствуйте, Qt-Coder, Вы писали:
QC>>Каждый поток начинает транзацкцию, выполняет update пачкой ·>Я давно в базах не возился, но смутно помню, что есть такое "lock escalation" — когда субд решает, что делать row lock для "слишком много" отдельных строк в данной транзации — накладно и пытается сделать table lock. ·>Оно?..
оракл такой фигней по иделогическим причинам не занимается. в оракле енжин блокировки исключительно на уровне строк юзает. табличку разве что вручную можно залочить.
Здравствуйте, ·, Вы писали:
·>Я давно в базах не возился, но смутно помню, что есть такое "lock escalation" — когда субд решает, что делать row lock для "слишком много" отдельных строк в данной транзации — накладно и пытается сделать table lock. ·>Оно?..
Просто рестартуй транзакцию, со 2 раза скорей всего сработает (ну или пусть клиент повторяет запрос). Подобная ситуация изредка это норма и плата за иллюзию изоляции транзакций.
Здравствуйте, vsb, Вы писали:
vsb>Просто рестартуй транзакцию, со 2 раза скорей всего сработает (ну или пусть клиент повторяет запрос). Подобная ситуация изредка это норма и плата за иллюзию изоляции транзакций.
Именно так и приходится делать, но хотелось бы понять причину.