原子性(atomicity):強調事務的不可分割;
一致性(consistency):事務的執行先後數據的完整性保持一致;
隔離性(isolation):一個事務的執行的過程當中,不該該受到其餘事務的干擾;
持久性(durability):事務一旦結束,數據就持久到數據庫。數據庫
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,而且實現者須要支持保存點事務機制。