Здравствуйте, Softwarer, Вы писали:
S>Ответ (не столько для автора, который, надеюсь, прочитал ссылку wildwind-а и решил проблему, сколько для тех, кто будет и дальше плодить кривые решения нагуглит этот топик). Причины могут быть разными. Наиболее вероятная, пожалуй — причина в нехватке слотов транзакций в блоке. Если десяток потоков пытаются изменить каждый свою запись в одном и том же блоке — первым, допустим, четырём это удастся, а остальные станут в очередь ждать коммита счастливчиков, и могут дождаться дедлока, когда счастливчики дойдут до обновление блока, заблокированного ждунами ранее. Можно назвать и другие сценарии. При каждом дедлоке подробная информация о нём фиксируется на сервере и доступна DBA для анализа (что и нужно сделать). При этом правильное решение проблемы — внести в архитектуру или программный код исправление, которое сделает сценарий дедлока невозможным. Какое именно — зависит от ситуации. Довольно часто наилучшее решение — вообще выбросить нахрен это множество конкурирующих потоков и воспользоваться более адекватным средством (например, параллельным update-ом).
Влияет ли INITRANS на данный сценарий?
Версия сервера 11.2.0.4.0
У меня задан INITRANS=10, потоков 6.
Я читал что Начиная с десятой версии Oracle максимальное количество слотов, которое может быть в таблице транзакций стало фиксированным и составляет на данный момент времени 255.
и решение
Как сделать, чтобы подобные ситуации взаимных блокировок не возникали? Рецепт довольно прост. Во-первых, старайтесь не изменять параметры INITRANS и MAXTRANS в сторону уменьшения без острой необходимости. Во-вторых, если параметр был всё же изменён, увеличивайте его до полного исчезновения взаимных блокировок.