sqlcode не возвращает DEADABORT, когда в ESQL возникает тупик - PullRequest
0 голосов
/ 26 ноября 2010

Я пытаюсь понять, как можно управлять взаимоблокировками с помощью ESQL. Я создал 2 одновременных процесса, которые пытаются обновить таблицу «клиенты», точно так же, как пример, приведенный в книге О'Нила «База данных»: http://books.google.ca/books?id=UXh4qTpmO8QC&pg=PA298&lpg=PA298&dq=%22deadabort%22+oracle&source=bl&ots=2QF7eSbaW6&sig=IcEZtSXINKrOVro1UN-ShlNsAak&hl=en&ei=9BPvTKPfMtP4nwfqu_X1Cg&sa=X&oi=book_result&ct=result&resnum=1&ved=0CBcQ6AEwAA#v=onepage&q=%22deadabort%22%20oracle&f=false

Но по какой-то причине процесс 2, ожидающий завершения 1, блокирует оператор «exec sql update users» и никогда не вводит оператор «if (sqlca.sqlcode == DEADABORT)». Следовательно, я никогда не смогу справиться с тупиком.

У кого-нибудь есть идея?

1 Ответ

0 голосов
/ 26 ноября 2010

Не видя код, его трудно комментировать, но ошибку взаимоблокировки базы данных будет очень трудно (если не невозможно) создать в однопоточной программе, даже если у вас два соединения.

Воднопоточная программа

  • Соединение A блокирует строку R1.
  • Соединение B блокирует строку R2.
  • Соединение A пытается заблокировать строку R2 и ожидает

Он не достиг состояния тупика, потому что Соединение A просто ожидает Соединение B. База данных не знает, что оба соединения с базой данных принадлежат одному процессу / потоку, поэтому она не знает, что они заблокированы.

Эта проблема иногда возникает с пулами соединений.Один сеанс конечного пользователя блокирует общий ресурс, используя соединение из пула.Другие соединения пула заполняют все ожидания этого общего ресурса, а затем в исходном сеансе конечного пользователя не удается получить поток пула соединений для освобождения ресурса.

...