-
Есть база, к которой (через разные соединения) обращается несколько потоков. Случается - что разные потоки пытаются (почти) одновременно обновить данные в базе. Выполняю рекомендации по раздалению транзакций на читающие/пишущие, короткие пишущие. Однако это не всегда помогает - всё равно случаются дедлоки (deadlock update conflicts with concurrent update). Из-за этого приходится приостанавливать некоторые потоки. Вся кухня по разруливанию дедлоков отнимает достаточно много времени и кода. Фактически приходится заниматься сериализацией обращений к базе. Можно ли как-то обрабатывать дедлоки, что бы не заниматься сериализацией? Возможно база сама умеет как-то 'придерживать' потоки до завершения конкрурентных транзакций? Версия базы? Ну пусть будет FB 2.0.
-
уровни изоляции какие?
-
есть же ждущие транзакции.
-
Посмотрел еще раз. Не все так просто. Пока один поток пытается запись изменить, другой её пытается удалить. Буду что-то с логикой думать.
-
это читал? http://www.firebirdfaq.org/faq151/Рекомендации выполнил? > Буду что-то с логикой думать.
Хорошее направление мысли. Если часто возникают такие ситуации, то надо, как и рекомендуется, запихивать всё в ХП и использовать проверки в триггерах.
|