@Transactional注释在哪里?

问题

你是否应该将2@Transactional放在2851111862类和/或它们的方法中,或者更好地注释使用DAO对象调用的Service类?或者注释两个"层​​"是否有意义?


#1 热门回答(457 赞)

我认为交易属于服务层。它是了解工作单元和用例的人。如果你将几个DAO注入到需要在单个事务中协同工作的服务中,那么这是正确的答案。


#2 热门回答(267 赞)

总的来说,我同意其他人的说法,即交易通常是在服务级别上启动的(取决于你当然需要的粒度)。

然而,与此同时,我也开始将@Transactional(propagation = Propagation.MANDATORY)添加到我的DAO层(以及其他不允许启动事务但需要现有事务的层),因为更容易检测到忘记在调用者中启动事务的错误(例如服务)。如果你的DAO使用强制传播进行注释,你将收到一个异常,指出在调用该方法时没有活动事务。

我还有一个集成测试,我检查所有bean(bean post processor)以获取此注释,如果在不属于服务层的bean中存在除了Mandatory之外的传播的a@Transactionalannotation,则会失败。这样我确保我们不会在错误的层上启动事务。


#3 热门回答(76 赞)

Transactional Annotations应围绕所有不可分割的操作。

例如,你的电话是"更改密码"。这包括两个操作

  • 更改密码。
  • 审核变更。
  • 通过电子邮件向客户端发送密码已更改。

所以在上面,如果审核失败,那么密码更改是否也会失败?如果是这样,那么交易应该在1和2左右(所以在服务层)。如果电子邮件失败(可能应该具有某种故障安全性,因此它不会失败)那么它应该回滚更改密码和审核吗?

这些是你在决定把@Transactional放在哪里时需要问的问题。