Мертвая блокировка происходит при одновременном обновлении одной и той же записи базы данных в нескольких сеансах соединения - PullRequest
0 голосов
/ 01 октября 2010

Мы реализовали клиент-серверное приложение на основе сокетов для обработки нескольких запросов корзины.Ежедневно мы получаем тысячи запросов корзины.

Для этого мы реализовали многопоточную архитектуру для одновременной обработки запросов.Мы используем Oracle Connection Pool для операций с базой данных и устанавливаем оптимальное значение для размера пула соединений.В соответствии с нашим бизнес-процессом у нас есть основная таблица базы данных, и нам необходимо обновить один и тот же набор строк несколькими потоками, используя несколько сеансов подключения одновременно.Теперь возникают некоторые проблемы с блокировкой из-за того, что несколько потоков попытаются обновить данные в одних строках одновременно, используя несколько сеансов подключения, а также у нас есть некоторые другие нарушения первичного ключа в таблицах.Иногда база данных также блокируется путем одновременной вставки одних и тех же данных в несколько сеансов подключения.

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

1 Ответ

1 голос
/ 01 октября 2010

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

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

Что касается вашего комментария о нарушениях первичного ключа,вы используете что-то кроме последовательности Oracle для генерации ваших первичных ключей?Если так, то это почти наверняка проблема.Последовательности Oracle специально разработаны для предоставления уникальных первичных ключей в случае, когда у вас есть несколько сеансов, выполняющих одновременные вставки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...