Сначала поймите, что взаимоблокировка - это совершенно иная проблема, чем «запись заблокирована». Так что для «записи заблокированной» большую часть времени не должно быть ничего, что вам нужно делать. 9/10 вы хотите, чтобы программа ждала блокировки. если вы ждете слишком долго, возможно, вам придется пересмотреть границы транзакции. Например, здесь ваш шаблон кода довольно типичен. Вы читаете список «сделать», а затем «сделать это». В таких случаях будет редко, когда вы захотите сделать что-то особенное для «блокировки записи». если по какой-то причине строка таблицы batch_pre_dist_data_fix заблокирована, вам следует просто дождаться снятия блокировки и продолжения. если обратное верно, то, поскольку это задание занимает так много времени, и вы так долго блокируете batch_pre_dist_data_fix для другого процесса, вы можете переопределить границу транзакции. то есть, может быть, вы говорите, что после каждой итерации цикла вы делаете коммит. Но остерегайтесь того, как открытый курсор ведет себя при коммите.
тупик - совершенно другое животное. Здесь у вас всегда есть «другой сеанс», и db обнаружил ситуацию, когда вы никогда не сможете выйти из ситуации, и он убил один случайный сеанс. Таким образом, это когда сеанс 1 ожидает ресурса сеанса 2, а сеанс 2 ожидает ресурса f сеанса 1. Это условие бесконечного ожидания, которое может обнаружить db, поэтому он убивает одну случайную ошибку. Один из простых способов решения этой проблемы состоит в том, что если все транзакции, которые работают с несколькими таблицами, просто блокируют их в одном порядке, у нас не будет тупиковой ситуации. Допустим, у нас есть таблица A, B, C, D. Если мы просто решим, что таблицы будут заблокированы в этом порядке. то есть это нормально делать A, B, D или A, C, D или C, D - но никогда не делать D, C. Тогда вы не получите тупик. Для устранения неполадок см. Оракул дампа, созданный, когда он дал ошибку, найдите другой сеанс и список таблиц этого сеанса и посмотрите, как их следует заблокировать.