天天看點

@Transactional注釋在哪裡?| Java Debug 筆記

持續創作,加速成長!這是我參與「掘金日新計劃 · 10 月更文挑戰」的第10天,點選檢視活動詳情

@Transactional注釋在哪裡?

您應該将放置@Transactional在DAO類和/或它們的方法中,還是更好地注釋使用DAO對象調用的Service類?還是注釋兩個“層”是否有意義?

高分回答:

我認為交易屬于服務層。這是了解工作單元和用例的人。如果您将多個DAO注入到一個服務中,而這些DAO需要在單個事務中一起工作,那麼這是正确的答案。

高分回答:

總的來說,我同意其他人的說法,即事務通常是在服務級别上開始的(當然,這取決于您所需的粒度)。

但是,與此同時,我也開始添加@Transactional(propagation = Propagation.MANDATORY)到我的DAO層(以及其他不允許啟動事務但需要現有事務的層),因為在您忘記在調用方中開始事務的地方,錯誤檢測要容易得多(例如服務)。如果您的DAO帶有強制傳播注釋,您将獲得一個異常,指出在調用該方法時沒有活動的事務。

我還有一個內建測試,在該測試中,我檢查所有bean(bean後處理器)是否有此注釋,如果@Transactional在不屬于服務層的bean中存在非強制傳播的注釋,則失敗。這樣,我確定我們不會在錯誤的層上啟動事務。

高分回答:

事務性注釋應放在所有不可分割的操作周圍。

例如,您的呼叫是“更改密碼”。這包括兩個操作

修改密碼。
稽核更改。
向用戶端發送密碼已更改的電子郵件。      

繼續閱讀