SpringBoot中的事務


 一、說明介紹
①使用事務,我們只需要在需要事務的類或方法上使用@Transactional 注解即可,當注解在類上的時候意味着此類的所有public方法都是開啟事務的。被注解的方法都成為一個事務整體,同一個事務內共享一個數據庫連接,所有操作同時發生。如果在事務內部執行過程中發生了異常,則事務整體會自動進行回滾。
②任何的RuntimeExcetipn、Error將觸發回滾,任何的checkedException不觸發回滾,@Transactional(rollbackFor=Exception.class)或者throw new RuntimeException()就可以解決checkedException不觸發回滾。
③當用作方法上時,該方法所在類上的注解將失效。
④只有來自外部的方法調用才會引起事務行為,類內部方法調用本類內部的其他方法並不會引起事務行為。
⑤在入口類使用注解@EnableTransactionManagement開啟事務。

二、事務並發執行帶來的問題 
臟讀:一個事務讀到了另一個未提交事務修改過的數據
幻讀:一個事務先根據某些條件查詢出一些記錄,之后另一個事務又向表中插入了符合這些條件的記錄,原先的事務再次按照該條件查詢時,能把另一個事務插入的記錄也讀出來。
不可重復讀:一個事務只能讀到另一個已經提交的事務修改過的數據,並且其他事務每次對該數據進行一次修改並提交后,該事務都能查詢得到最新值。

三、事務的特性
原子性、一致性、隔離性和持久性,簡稱為事務的ACID特性。

四、事務隔離級別
@Transactional(isolation = Isolation.DEFAULT)
DEFAULT :默認值(也是SpringBoot的隔離級別默認值),表示使用底層數據庫的默認隔離級別。大部分數據庫為READ_COMMITTED(MySql默認隔離級別為REPEATABLE_READ)
READ_UNCOMMITTED :一個事務可以讀取另一個事務修改但還沒有提交的數據。
READ_COMMITTED :一個事務只能讀取另一個事務已經提交的數據。
REPEATABLE_READ :一個事務在整個過程中可以多次重復執行某個查詢,並且每次返回的記錄都相同。即使在多次查詢之間有新增的數據滿足該查詢,這些新增的記錄也會被忽略。
SERIALIZABLE :所有的事務依次逐個執行,這樣事務之間就完全不可能產生干擾。

五、事務傳播方式
@Transactional(propagation = Propagation.REQUIRED)
PROPAGATION_REQUIRED:支持當前事務,如果當前沒有事務,就新建一個事務。
PROPAGATION_SUPPORTS:支持當前事務,如果當前沒有事務,就以非事務方式執行。
PROPAGATION_MANDATORY:支持當前事務,如果當前沒有事務,就拋出異常。
PROPAGATION_REQUIRESNEW:新建事務,如果當前存在事務,把當前事務掛起。
PROPAGATION_NOT_SUPPORTED:以非事務方式執行,如果當前存在事務,就把當前事務掛起。
PROPAGATION_NEVER:以非事務方式執行,如果當前存在事務,則拋出異常。
PROPAGATION_NESTED:如果一個活動的事務存在,則運行在一個嵌套的事務中,如果當前沒有事務,則執行與PROPAGATION_REQUIRED類似的操作。

思考:
1、事務傳播方式交互使用,外層方法與內層方法事務傳播方式不同:
①同一事物:PROPAGATION_REQUIRED,PROPAGATION_SUPPORTS,PROPAGATION_MANDATORY
②不同事物:PROPAGATION_REQUIRES_NEW,PROPAGATION_NOT_SUPPORTED,PROPAGATION_NEVER,PROPAGATION_NESTED,
2、被catch后的異常處理:當 try catch 捕獲了異常,並將異常處理掉了,事務不會回滾;如果非要寫 try catch,需要 catch 后將異常throw出去,事物才能執行;
3、PROPAGATION_NESTED嵌套事物:內層事物回滾,不影響外部事物執行,外部事物影響內部事務執行。

六、SpringBoot中事務控制失效的原因
1.檢查你方法是不是public的(只有Public方法才能開啟事務)
2.檢查你的異常類型是不是unchecked異常(默認Error和RuntimeException事務回滾)。
3.檢查異常是不是被catch住了(當異常被捕獲后,並且沒有再拋出,那么事務是不會回滾的。)
4.檢查類有沒有被Spring管理(方法被標注了@Transactional,但是類沒有注解,沒有被Spring管理也不會生效)
5.代碼寫錯了
6 .數據庫引擎不支持事務(其 MyISAM 引擎是不支持事務操作的)

七、Transactional()中的參數說明
1、 propagation: 事務傳播行為
2、 isolation: 事務隔離級別
3、 timeout: 超時時間,事務需要在一定的時間內提交,不提交則進行回滾;默認值是-1,表示無時間限制
4、 readOnly: 是否只讀
(1).默認值為false,表示可以查詢,可以增刪改;
(2).如果設置為true,只能查詢操作。
5、rollbackFor: 回滾,設置出現哪些異常進行事務回滾。
6、noRollbackFor: 不回滾,設置出現哪些異常不進行回滾。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM