Тайм-аут запроса на выборку из внешнего сервиса после обновления в той же таблице - PullRequest
0 голосов
/ 16 мая 2018

Это такая странная ситуация.У меня есть база данных 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 запрос, запущенный внутри этого сервиса.

Я не понимаю, что происходит.Я попытался поместить эти обновления в транзакцию и зафиксировать ее в конце процедуры, но это не помогло.Есть идеи?

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