(я размышляю здесь, потому что я не знаю ваши настройки)
Краткий ответ:
Часто исключение StaleObjectStateException (которое, я полагаю, вы получаете) возникает, когда запись базы данных за объектом домена (в вашем случае Lead) была обновлена между последним чтением из БД и вашим вызовом save()
.
В зависимости от ваших настроек это может быть второй экземпляр вашего приложения Grails.
Одним из возможных решений может быть пессимистическая блокировка (см. 7.3.5 Пессимистическая и оптимистическая блокировка в документации Grails).
Более длинный ответ (извините, если вы уже знаете более техническую информацию):
get()
возвращает объект домена из нижележащего сеанса Hibernate. Этот сеанс не распознает изменения в базе данных автоматически.
Поэтому, если БД изменится, данные в вашем сеансе Hibernate могут устареть.
GORM (слой БД Grails) обычно использует оптимистическую блокировку (пытается сохранить и увеличивает значение в поле version
записи БД).
Если версия объекта домена, который пытается сохранить ваш код, меньше, чем версия объекта в БД, то GORM / Hibernate считает, что лучше создать исключение, чем обновить запись и, возможно, уничтожить более новые изменения.
При пессимистической блокировке ваш код сначала блокирует запись или таблицу БД, затем обновляет запись и, наконец, снимает блокировку.
Но будьте осторожны: пессимистическая блокировка приносит с собой свои проблемы.