@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
放在哪里时,这些问题是您需要问的问题。
上一篇: Where does the @Transactional annotation belong?
下一篇: Transactions in .net