Manejo de transacciones de Grails mediante programación

Cuando necesito guardar una lista de objetos, y cada objeto debe guardarse en su propia transacción (de modo que si uno falla no todos fallan), lo hago así:

List<Book> books = createSomeBooks()
books.each { book ->
  Book.withNewSession {
    Book.withTransaction {TransactionStatus status ->
      try {
        book.save(failOnError: true)
      } catch (ex) {
        status.setRollbackOnly()
      }
    }
  }
} 

yo sueloBook.withNewSession porque si un libro no se guarda y la transacción se revierte, la sesión no será válida, lo que evitará que se guarden libros posteriores. Sin embargo, hay un par de problemas con este enfoque:

Es un poco detalladoSiempre se creará una nueva sesión para cada libro, incluso si el libro anterior tuvo éxito

¿Hay una mejor manera? Una posibilidad que se me ocurrió es inyectar dependencia al HibernateSessionFactory y hacer esto en su lugar

List<Book> books = createSomeBooks()
books.each { book ->
  try {
    Book.withTransaction {
      book.save(failOnError: true)
    }
  } catch (ex) {
    // use the sessionFactory to create a new session, but how....?
  }
}

Respuestas a la pregunta(3)

Su respuesta a la pregunta