Как избежать отправки ответа до сохранения транзакции в Grails? - PullRequest
2 голосов
/ 30 января 2012

Мы столкнулись с проблемой транзакции с Grails. Во время теста производительности у нас есть сценарий, когда один API вызывается несколько раз для одного и того же пользователя. Во время каждого вызова что-то изменяется в доменном объекте и сохраняется в базе данных.

Мы обнаружили, что, возможно, обновление базы данных будет выполнено после того, как ответ будет отправлен клиенту, и ДО того, как на сервер поступит другой запрос на тот же API. Таким образом, мы заканчиваем другим вызовом API, который выбирает данные из базы данных до того, как первый вызов API обновляет их, и мы получаем StaleObjectStateException, когда второй запрос пытается сохранить данные в базе данных.

Мы использовали функцию автоматической фиксации в Grails, которая сохраняет все после завершения транзакции. Итак, первое решение было начать использовать .save () перед render () в контроллере. Это нормально, когда вы делаете это для простых API, но у нас есть некоторые более сложные API, где нам нужно было бы отслеживать довольно много объектов и сохранять их явно. В настоящее время кажется, что работает без сброса: правда, но мы все еще тестируем.

Итак, мой вопрос: есть ли способ убедиться, что ответ не отправлен до того, как транзакция будет выполнена в Grails?

Ответы [ 2 ]

0 голосов
/ 16 февраля 2012

Это произошло из-за инструмента, который мы использовали для тестирования - SoapUI.Он может отправить повторный запрос, прежде чем ответ вернется.Это заставило нас думать, что это вина Грааля.Это не было.

0 голосов
/ 30 января 2012

Вероятно, это связано с кэшированием. Если вам требуются гарантии относительно состояния базы данных, вам нужно .save (flush: true).

Обратите внимание, что это сбрасывает все во время сеанса, так что это можетнегативно влияет на производительность.

Редактировать: Не уверен, как мне удалось прочитать ваш вопрос, не увидев части о том, что вы уже выполняете flush: true.

В любом случае, это действительно так, как выдолжен идти.

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