1. 程式人生 > >事務註解 @Transactional一般的話為什麼都加在service層而不加在dao層

事務註解 @Transactional一般的話為什麼都加在service層而不加在dao層

什麼是事務?

在資料庫中,所謂事務是指一組邏輯操作單元即一組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層。