Spring事務:
事務特性(4種):
原子性(atomicity):強調事務的不可分割;
一致性(consistency):事務的執行前后數據的完整性保持一致;
隔離性(isolation):一個事務的執行的過程中,不應該受到其他事務的干擾;
持久性(durability):事務一旦結束,數據就持久到數據庫。
如果不考慮隔離性引發的安全性問題:
解決讀問題:設置事務隔離級別(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,並且實現者需要支持保存點事務機制。