目前,我使用openSession(),在具有经典dao和服务层的方法中开始并提交事务,并在其中保存/更新/删除多个对象。如果存在任何错误,我确信此方法中的任何保存/更新都没有完成。
是否可以通过getCurrentSession()在使用@Transactional注释调用的方法中保存多个对象,如果这可以保证此方法中的所有对象都保存/更新或者没有完成,那么它是否安全?如果可能的话,我如何在这种方法中使用回滚?
答案 0 :(得分:1)
是的,您可以使用适当的事务语义。
@Transactional
有一个名为rollbackFor = TypeOfException.class
的媒体资源。默认情况下,它会回滚RuntimeException
,但您可以为任何已检查的例外指定您自己或Exception
。
你应该有一个适当的传播,你也可以在@Transactional
指定一个属性。请注意,如果设置propagation = REQUIRES_NEW
并且现有事务调用此方法,则仅针对嵌套事务回滚。你想要实现的目标,我认为最常见的是指定propagation = REQUIRED
- 这不会在自己的交易上运行,而是在现有交易上运行,这意味着在整个交易失败的情况下将回滚。