Это такая странная ситуация.У меня есть база данных Microsoft SQL Server, приложение, написанное на java (запросы выполняются с использованием javax.persistence.Query) и внешний сервис, написанный на C #.
У меня есть процедура, которая выполняет обновление таблицы MyTable.В этой процедуре есть только два оператора обновления:
UPDATE
MyTable
SET
status = dbo.getStat(id)
WHERE
EXISTS
(
...
)
UPDATE
MyTable
SET
status = 3
WHERE
status = 2
AND EXISTS
(
...
)
Часть EXISTS одинакова для обоих операторов.В моем Java-приложении я использую следующий код для запуска этой процедуры:
Query query = em.createNativeQuery(recources.getString("updateStatuses"));
query.setHint("toplink.refresh", "true");
query.setParameter(1, sessId);
query.executeUpdate();
Под updateStatuses у меня есть следующий sql:
EXEC updateStatusesP ?
После этого я выбираю записи из этой таблицы, если они имеют статусравно 3:
SELECT
id
FROM
MyTable
WHERE
status = 3
AND EXISTS
(
...
)
Я перебираю идентификаторы и вызываю внешнюю службу, написанную на C #, которая изменяет данные в БД.
Дело в том, что в настоящее время я получаювремя ожидания для запроса на выборку, запущенного из этого внешнего сервиса.Это запрос выбора данных из MyTable.
Если я удаляю первый оператор обновления из моей процедуры updateStatusesP, тогда он работает нормально (без тайм-аута).Если я изменю первый запрос, включив условие «status =» в предложение WHERE, то он также будет работать нормально.Но без него я получаю этот тайм-аут.
В этой таблице есть триггер и индекс.Я удалил их, чтобы проверить, может быть, там что-то происходит.Без изменений.
Если я сделаю прямой вызов этой внешней службе (через почтальона), то получу правильный ответ.Только при вызове из кода приложения: процедура, выберите запрос для выбора идентификаторов, а затем вызовите внешнюю службу - я получаю ответ от этой службы (с информацией о тайм-ауте) и вижу в инструменте мониторинга БД, что это не такgo pass first select запрос, запущенный внутри этого сервиса.
Я не понимаю, что происходит.Я попытался поместить эти обновления в транзакцию и зафиксировать ее в конце процедуры, но это не помогло.Есть идеи?