Transctional readOnly = true и сохранение объектов в Grails и Postgres - PullRequest
1 голос
/ 17 декабря 2011

Мы используем Grails [Spring + Hibernate] и у нас есть один сервисный метод с @Transactional (readOnly = true).Во время разработки и тестирования мы использовали HSQLDB, и поведение было таким, что мы могли использовать .save (flush: true), и объект был бы сохранен в базе данных, но все другие объекты были бы откатаны.Все было здорово принять, когда мы перешли на Postgres.Теперь эти параметры отбрасываются назад: ОШИБКА - транзакция доступна только для чтения.

РЕДАКТИРОВАТЬ:

Мы должны иметь возможность откатить все данные в транзакции, но при этом сохранить данные, которые нам нужныбыть сохраненным [некоторый дополнительный материал, не связанный с транзакцией, например что-то для целей регистрации].Он не хочет использовать триггеры БД для этого.Мы также не хотим получать исключения устаревших объектов при сохранении содержимого после обработки исходного запроса.Любые идеи о том, как мы могли бы достичь этого?Единственное, что приходит мне в голову, - это иметь какой-то реестр, в котором мы будем хранить ссылки на измененные объекты и в конце удаляем все изменения, но это последнее средство.Я уверен, что есть способ решить эту проблему, не делая глупостей.

Ответы [ 3 ]

2 голосов
/ 17 декабря 2011

Я думаю, что Spring просто вызывает connection.setReadOnly (true), а затем дело за драйвером jdbc.Может быть, HSQLDB jdbc воспринимает это только как подсказку для оптимизации чего-либо. Posgresql документы доступны для семантики только для чтения:

Когда транзакция только для чтения, следующие команды SQL запрещены: INSERT, UPDATE, DELETE и COPY FROMесли таблица, в которую они пишут, не является временной таблицей;все команды CREATE, ALTER и DROP;КОММЕНТАРИЙ, ГРАНТ, ОТЗЫВ, ТРАНСКАТ;и EXPLAIN ANALYZE и EXECUTE, если команда, которую они будут выполнять, входит в число перечисленных.

0 голосов
/ 20 декабря 2011
0 голосов
/ 17 декабря 2011

милан.Я работаю с Кристианом и над этой конкретной проблемой.Я протестировал все поля распространения, чтобы решить эту проблему, и ни одно из них не сработало (PROPAGATION_REQUIRED, REQUIRES_NEW и NESTED выглядели достойными попытки).

...