Spring的四種事務特性,五種隔離級別,七種傳播行為


Spring事務:

什么是事務:
事務邏輯上的一組對數據對操作,組成這些操作的各個邏輯單元,要么一起成功,要么一起失敗。

事務特性(4種):

原子性(atomicity):強調事務的不可分割;
一致性(consistency):事務的執行前后數據的完整性保持一致;
隔離性(isolation):一個事務的執行的過程中,不應該受到其他事務的干擾;
持久性(durability):事務一旦結束,數據就持久到數據庫。

如果不考慮隔離性引發的安全性問題:

臟讀:一個事務讀到了另一個事務未提交的數據
不可重復讀:一個事務督導另一個事務已經提交的update的數據導致多次查詢結果不一致
虛幻讀:一個事務讀到了另一個事務已經提交的insert的數據導致多次查詢結果不一致。

解決讀問題:設置事務隔離級別(5種)

DEFAULT這是一個PlatfromTransactionManager默認的隔離級別,使用數據庫默認的事務隔離級別;
未提交讀(read uncommited):臟讀,不可重復讀,虛讀都有可能發生
已提交讀(read commited):避免臟讀。但是不可重復讀和虛讀都有可能發生;
可重復讀(repeatable read):避免臟讀和不可重復讀,但是虛讀有可能發生;
串行化的(serializable):避免以上所有讀問題。
MySQL默認:可重復讀
Oracle默認:已提交讀

read uncommitted:是最低讀事務隔離級別,它允許另外一個事務可以看到這個事務未提交讀數據。
read commited: 保證一個事務提交后才能被另外一個事務讀取。另外一個事務不能讀取該事務未提交的數據。
repeatable read:這種事務隔離級別可以防止臟讀,不可重復讀。但是可能會出現幻想讀。它除了保證一個事務不能被另外一個事務讀取未提交讀數據之外還避免了一下情況產生(不可重復讀)。
serializable:這是花費最高代價但最可靠但事務隔離級別。事務被處理為順序執行。除了防止臟讀,不可重復讀之外,還避免了幻象讀(避免三種)。

 

事務讀傳播行為

PROPAGION_XXX:事務的傳播行為
* 保證同一個事務中
PROPAGATION_REQUIRED      如果存在一個事務,則支持當前事務。如果沒有事務則開啟一個新的事務。
PROPAGATION_SUPPORTS       如果存在一個事務,支持當前事務。如果沒有事務,則非事務的執行。但是對於事務同步的事務管理器,PROPAGATION_SUPPORTS與不使用事務有少許不同。
PROPAGATION_MANDATORY        如果已經存在一個事務,支持當前事務。如果沒有一個活動的事務,則拋出異常。
* 保證沒有在同一個事務中
PROPAGATION_REQUIRES_NEW     總是開啟一個新的事務。如果一個事務已經存在,則將這個存在的事務掛起。
PROPAGATION_NOT_SUPPORTED      總是非事務地執行,並掛起任何存在的事務。
PROPAGATION_NEVER      總是非事務地執行,如果存在一個活動事務,則拋出異常
PROPAGATION_NESTED      如果一個活動的事務存在,則運行在一個嵌套的事務中. 如果沒有活動事務, 則按TransactionDefinition.PROPAGATION_REQUIRED 屬性執行

事務傳播行為種類:

Spring在TransactionDefinition接口中規定了7種類型的事務傳播行為,它們規定了事務方法和事務方法發生嵌套調用時事務如何進行傳播:
下表為事務傳播行為類型

事務傳播行為類型 說明
PROPAGATION_REQUIRED 如果當前沒有事務,就新建一個事務,如果已經存在一個事務中,加入到這個事務中。這是最常見的選擇。
PROPAGATION_SUPPORTS

支持當前事務,如果當前沒有事務,就以非事務方式執行。

PROPAGATION_MANDATORY

使用當前的事務,如果當前沒有事務,就拋出異常。

PROPAGATION_REQUIRES_NEW

新建事務,如果當前存在事務,把當前事務掛起。

PROPAGATION_NOT_SUPPORTED

以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。

PROPAGATION_NEVER

以非事務方式執行,如果當前存在事務,則拋出異常。

PROPAGATION_NESTED

如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則執行與PROPAGATION_REQUIRED類似的操作。

 

 

 

 

 

 

 

 

 

 

 

 

 

  

 

 

 

 

當使用PROPAGATION_NESTED時,底層的數據源必須基於JDBC 3.0,並且實現者需要支持保存點事務機制。

 
 
 
 
 


免責聲明!

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



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