@Transactional注释属于哪里?

你应该将@Transactional放在DAO类和/或它们的方法中,还是最好使用DAO对象来注释正在调用的Service类? 或者是否有意义的注释这两个“层”?


我认为交易属于服务层。 这是知道工作单位和用例的人。 如果您有多个DAO注入需要在单个事务中协同工作的服务,那么这是正确的答案。


总的来说,我同意其他人的观点,即交易通常从服务级别开始(取决于您需要的粒度)。

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

我也有一个集成测试,在这个集合测试中,我检查了所有bean(bean post processor)的注解,并且如果在不属于服务层的bean中存在一个带有非Mandatory的传播的@Transactional注解,则失败。 这样我就可以确保我们不会在错误的层上启动事务。


事务注释应该放在所有不可分割的操作周围。

例如,您的电话是“更改密码”。 这包括两个操作

  • 更改密码。
  • 审核更改。
  • 通过电子邮件向客户发送密码已更改。
  • 所以在上面,如果审计失败,那么密码更改是否也会失败? 如果是这样,那么交易应该是1和2左右(所以在服务层)。 如果电子邮件失败(可能应该有某种失败的安全措施,以免失败),那么它是否应该回滚更改密码和审核?

    在决定将@Transactional放在哪里时,这些问题是您需要问的问题。

    链接地址: http://www.djcxy.com/p/49975.html

    上一篇: Where does the @Transactional annotation belong?

    下一篇: Transactions in .net