我的Grails应用程序有一个服务方法,它可以更新last.fm的web服务中的艺术家列表。Grails编程事务处理
@Transactional(propagation = Propagation.NOT_SUPPORTED)
void updateLastFmArtists(Range idRange = null) {
Artist.list().each { Artist artist ->
// We could be updating a lot of artists here, the process could take up
// to an hour and we don't want to wrap all that in a single transaction
Artist.withTransaction { status ->
try {
updateArtistInfo(artist)
} catch (IOException ex) {
status.setRollbackOnly()
}
}
}
}
每个个体艺术家它自己的事务,如果IOException
抛出应当回滚内更新。不过,我注意到以下行为:
如果要更新一个艺术家试图抛出一个IOException
- 导致事务回滚 - 那么接下来艺术家的更新总是失败,因为以下错误
org.hibernate.LazyInitializationException:无法初始化懒洋洋地一 角色的集合:org.example.Artist.topTracks,没有会话或 会话关闭
如果我改变上面的代码,使每一位艺术家被更新w^ithin它自己的会话,这似乎是解决问题,
Artist.withNewSession { session ->
Artist.withTransaction { status ->
try {
updateArtistInfo(artist)
} catch (IOException ex) {
status.setRollbackOnly()
}
}
}
但我不明白为什么我要做到这一点,即这是为什么回滚事务似乎关闭会话?
+1但是,在这种特殊情况下,它不是一个无法解决的异常,这是我在单个事务范围内捕捉的一个例外。我觉得这很令人吃惊,这会使整个会话无效 –
我增加了一些对此的引用,基于文档的建议是重新开始新会话,因为会话的某些方法不会使会话保持一致状态在回滚的情况下 –
感谢您的帮助,但是,上面的引用是关于Hibernate或Hibernate异常抛出的异常,但我的情况并不涉及这两种异常。我猜这是我对'status.setRollbackOnly()'的调用,它会使会话失效而不是抛出的异常 –