Операционные системы : Солярис
База данных : Informix
У меня есть процесс, который имеет 2 потока:
Поток 1, имеющий дело с новыми транзакциями и делающий БД INSERTS
Поток 2, имеющий дело с существующими транзакциями и делающий БД DELETES
ПРОБЛЕМА
Поток 1 постоянно выполняет INSERTS (добавление новых транзакций) для таблицы.
Поток 2 постоянно выполняет DELETES (удаление транзакций с истекшим сроком) из той же таблицы на основе первичного ключа
INSERTS терпят неудачу из-за ошибки Informix 244
которые происходят из-за блокировки страницы / таблицы.
Я предполагаю, что DELETE выполняет блокировку таблицы вместо блокировки строк и не позволяет вставкам работать.
Можно ли как-нибудь предотвратить эту блокировку?
РЕДАКТИРОВАТЬ
Я нашел другую подсказку. 244
ошибка вызвана SELECT
запрос.
И то и другое insert
а также delete
операция делает select
из часто обновляемой таблицы, прежде чем делать операцию.
Изоляция установлена как COMMITTED READ
, Когда я вручную делаю select
на этой таблице из dbaccess, когда происходит удаление, я получаю ту же ошибку.
Я был бы очень удивлен, если бы DELETE делал полную блокировку таблицы при удалении отдельных элементов по первичному ключу. Скорее всего, вероятно, что длительность одной (или обеих) самих транзакций в конечном итоге приводит к отключению блокировки таблицы из-за количества измененных строк. В общем, вы можете избежать взаимоблокировок в изменчивых таблицах, таких как эта, устраняя все операции, кроме однострочных, в каждой транзакции и гарантируя, что ваша модель транзакции будет зафиксирована для чтения. По крайней мере, таким был мой опыт.
Других решений пока нет …