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:這是花費最高代價但最可靠但事務隔離級別。事務被處理爲順序執行。除了防止髒讀,不可重複讀以外,還避免了幻象讀(避免三種)。atom

 

事務讀傳播行爲

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

spa

事務傳播行爲種類:blog

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

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

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

PROPAGATION_MANDATORYci

使用當前的事務,若是當前沒有事務,就拋出異常。同步

PROPAGATION_REQUIRES_NEW

新建事務,若是當前存在事務,把當前事務掛起。it

PROPAGATION_NOT_SUPPORTED

以非事務方式執行操做,若是當前存在事務,就把當前事務掛起。

PROPAGATION_NEVER

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

PROPAGATION_NESTED

若是當前存在事務,則在嵌套事務內執行。若是當前沒有事務,則執行與PROPAGATION_REQUIRED相似的操做。

 

 

 

 

 

 

 

 

 

 

 

 

 

  

 

 

 

 

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

相關文章
相關標籤/搜索