当我需要保存一个对象列表,并且每个对象都应该保存在它自己的事务中时(这样如果一个失败,它们不会全部失败),我这样做:以编程方式处理Grails交易
List<Book> books = createSomeBooks()
books.each { book ->
Book.withNewSession {
Book.withTransaction {TransactionStatus status ->
try {
book.save(failOnError: true)
} catch (ex) {
status.setRollbackOnly()
}
}
}
}
我使用Book.withNewSession
,因为如果一本书无法保存并且事务回滚,则会话将无效,这将阻止后续书籍的保存。然而,有一对夫妇的问题,这种方法:
- 这是一个有点冗长
- 一个新的会话将始终为每本书创建的,即使前一本书成功
有没有更好的方法?这发生在我身上的一种可能是依赖项注入休眠SessionFactory
和做到这一点,而不是
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....?
}
}
为什么你需要为每个迭代创建一个新的会话?恕我直言,足以在每次迭代只执行交易块,但所有可能发生在一个会话中.. – lukelazarovic
@lukelazarovic我只需要一个新的会话,如果发生回滚。我遇到的问题是我不知道如何在catch块中创建新会话 –