要想在Spring中使用事務,就需要先了解事務
1.什么是事務?
- 事務(TRANSACTION) 是作為單個邏輯工作單元執行的一系列操作。
- 多個操作作為一個整體向系統提交,要么都執行,要么都不執行。
- 事務是一個不可分割的邏輯單元。
2.事務的特性(ACID)
- 原子性(Atomicity) 原子性是指事務是一個不可分割的工作單位,事務中的操作要么都發生,要么都不發生。
- 一致性(Consistency) 事務前后數據的完整性必須保持一致。
- 隔離性(Isolation) 事務的隔離性是多個用戶並發訪問數據庫時,數據庫為每一個用戶開啟的事務,不能被其他事務的操作數據所干擾,多個並發事務之間要相互隔離。
- 持久性(Durability) 持久性是指一個事務一旦被提交,它對數據庫中數據的改變就是永久性的,接下來即使數據庫發生故障也不應該對其有任何影響
3.什么是臟讀,不可重復讀,幻讀?
- 臟讀:簡單來說,就是一個事務讀取到了另一個事務未提交的數據。
- 不可重復讀:就是說,比如在A事務中進行多次相同的查詢,B事務在A事務多次查詢之間修改對應表中的數據,導致A事務多次讀取的結果不一致。
- 幻讀:舉例來說,就是A事務將表中'性別'列的值都更改為1,B事務在A事務修改之后又添加了一條記錄,而'性別'的值為0,回過來A再查詢所以的記錄時會發現有一條記錄的'性別'為0,這種情況就是所謂的幻讀
4.事務的四種隔離級別
- ISOLATION_READ_UNCOMMITTED:讀未提交
- ISOLATION_READ_COMMITTED:讀已提交
- ISOLATION_REPEATABLE_READ:可重復讀
- ISOLATION_SERIALIZABLE:串行化
5.四種隔離可以解決的問題
6.事務的七種傳播行為
什么是事務的傳播行為:事務傳播行為用來描述由某一個事務傳播行為修飾的方法被嵌套進另一個方法的時事務如何傳播。
- PROPAGATION_REQUIRED 表示當前方法必須在一個具有事務的 上下文中運行,如有客戶端有事務在進行,那么被調用端將在該事務中運行,否則的話重新開啟一個事務。( 如果被調用端發生異常,那
么調用端和被調用端事務都將回滾)
- PROPAGATION_SUPPORTS 表示當前方法不必需要具有一個事務 上下文,但是如果有一個事務的話,它也可以在這個事務中運行
- PROPAGATION_MANDATORY 表示當前方法必須在一個事務中運行,如果沒有事務,將拋出異常
- PROPAGATION_REQUIRES_NEW 總是開啟一個新的事務。如果一個事務已經存在,則將這個存在的事務掛起。
- PROPAGATION_NOT_SUPPORTED 總是非事務地執行,並掛起任何存在的事務。
- PROPAGATION_NEVER 總是非事務地執行,如果存在一個活動事務,則拋出異常
- PROPAGATION_NESTED表示如果當前方法正有一個事務在運行中,則該方法應該運行在一個嵌套事務中 ,被嵌套的事務可以獨立於被封裝的事務中進行提交或者回滾。如果封裝事務存在,並且外層事務拋出異常回滾,那么內層事務必須回滾,反之,內層事務並不影響外層事務。如果封裝事務不存在,則同propagation. required的一樣