事務註解 @Transactional一般的話為什麼都加在service層而不加在dao層
阿新 • • 發佈:2018-12-25
什麼是事務?
在資料庫中,所謂事務是指一組邏輯操作單元即一組sql語句。當這個單元中的一部分操作失敗,整個事務回滾,只有全部正確才完成提交。判斷事務是否配置成功的關鍵點在於出現異常時事務是否會回滾
事務四大特性
1. 原子性(Atomicity)
原子性是指事務是一個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。
2. 一致性(Consistency)
事務必須使資料庫從一個一致性狀態變換到另外一個一致性狀態。(資料不被破壞
3.隔離性(Isolation)
事務的隔離性是指一個事務的執行不能被其他事務干擾.
4.永續性(Durability)
永續性是指一個事務一旦被提交,它對資料庫中資料的改變就是永久性的.即使系統重啟也不會丟失.
結合事務的特點,為什麼加在service層就很好解釋了。如果我們的事務註解@Transactional加在dao層,那麼只要與資料庫做增刪改,就要提交一次事務,如此做事務的特性就發揮不出來,尤其是事務的一致性,當出現併發問題是,使用者從資料庫查到的資料都會有所偏差。
一般的時候,我們的service層可以呼叫多個dao層,我們只需要在service層加一個事務註解@Transactional,這樣我們就可以一個事務處理多個請求,事務的特性也會充分的發揮出來。
也可以這麼說:
因為一個Service完成一個服務,但是可能會呼叫很多個DAO層的功能,如果Transaction放在DAO層的話,做完一個DAO,就會提交一次事務,永久修改資料庫,後面在呼叫另外一個DAO,但是throws Exception,對於整個的Service來說,應該是要完全回滾的,但是隻能回滾到當前的DAO
所以這就破壞了事務的ACID
有一些專案的事務是在Controller層。