Вы задали много вопросов и должны разбить их на несколько отдельных вопросов. Но я остановлюсь на общем вопросе - этот подход в целом хорош.
При запуске и совершении транзакции не требуется много времени, которая не обеспечивает постоянство базы данных, но это расточительно, поэтому вам следует добавить
static transactional = false
В этом случае вы используете класс как легко внедряемый одноэлементный вспомогательный класс. В сервисах удобно выполнять транзакционную работу, потому что они автоматически транзакционны, но это далеко не обязательно.
Но одно дело - не используйте замыкания в службах. Они требуются в контроллерах и taglibs (до 2.0 в любом случае), но их всегда следует избегать в сервисах и других классах. Если вы не используете тот факт, что это замыкание - то есть передаете его как объект методу в качестве параметра или устанавливаете его делегат и т. Д. - тогда вы просто слишком круты. Если вы вызываете его как метод, сделайте его методом. Реальный недостаток закрытия сервисов заключается в том, что когда вы хотите, чтобы они были транзакционными, они не могут быть такими. Это происходит потому, что перехватчики Spring перехватывают вызовы методов, а не вызовы замыкания, которые, как утверждает Groovy, являются вызовами методов. Таким образом, не будет никакого перехвата транзакций, безопасности и т. Д.