Spring事務處理是很重要的一個知識點,下面來簡單總結下基本知識,加深理解和記憶。
參考資料:https://blog.csdn.net/donggua3694857/article/details/69858827
https://blog.csdn.net/Java_3y/article/details/86711521
《高性能MySQL》
1、數據庫事務的ACID屬性:
例子:從Jack的賬戶轉200元到Tom的賬戶:
步驟:1)檢查Jack的賬號是否夠200元;
2)Jack賬號減去200元;
3)Tom賬號增加200元。
2、 4種數據庫事務的隔離級別:
3、Spring事務的傳播行爲
名稱 | 值 | 解釋 |
Propagation.REQUIRED | 0 | 支持當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇,也是Spring默認的事務的傳播。 |
Propagation.SUPPORT | 1 | 支持當前事務,如果當前沒有事務,就以非事務方式執行。 |
Propagation.MANDATORY |
2 | 支持當前事務,如果當前沒有事務,就拋出異常。 |
Propagation.REQUIRES_NEW |
3 | 新建事務,如果當前存在事務,把當前事務掛起。 |
Propagation.NOT_SUPPORTED |
4 | 以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。 |
Propagation.NEVER |
5 | 以非事務方式執行,如果當前存在事務,則拋出異常 |
Propagation.NESTED |
6 | 如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則進行與Propagation.REQUIRED類似的操作。 |
3.2、Spring事務的傳播機制
如果是在本類中沒有事務的方法來調用標註註解@Transactional方法,最後的結論是沒有事務的。由於Spring聲明式事務管理用的是AOP,所以在沒有事務的方法中拿到的是代理對象,是沒有事務存在的。
在本類中有事務的方法調用其他方法(不管是否有事務),都屬於事務傳播機制的知識範疇。
4、事務超時:
爲了使應用程序很好地運行,事務不能運行太長的時間。因爲事務可能涉及對後端數據庫的鎖定,所以長時間的事務會不必要的佔用數據庫資源。事務超時就是事務的一個定時器,在特定時間內事務如果沒有執行完畢,那麼就會自動回滾,而不是一直等待其結束。
5、 事務回滾規則:
事務五邊形的最後一個方面是一組規則,這些規則定義了哪些異常會導致事務回滾而哪些不會。默認情況下,事務只有遇到運行期異常時纔會回滾,而在遇到檢查型異常時不會回滾 。但是你可以聲明事務在遇到特定的檢查型異常時像遇到運行期異常那樣回滾。同樣,你還可以聲明事務遇到特定的異常不回滾,即使這些異常是運行期異常。
6、Spring事務管理的幾個重要接口
Spring事務可以分爲兩種:
- 編程式事務(通過代碼的方式來實現事務)
- 聲明式事務(通過配置的方式來實現事務,可以細分爲aop,xml配置和@transaction註解)
6.1 在編程式事務中有以下幾個重要的接口:
TransactionDefinition:定義了Spring兼容的事務屬性(比如事務隔離級別、事務傳播、事務超時、是否只讀狀態)
TransactionStatus:代表了事務的具體運行狀態(獲取事務運行狀態的信息,也可以通過該接口間接回滾事務等操作)
PlatformTransactionManager:事務管理器接口(定義了一組行爲,具體實現交由不同的持久化框架來完成—類比JDBC)
6.2 在聲明式事務中,除了TransactionStatus和PlatformTransactionManager接口,還有幾個重要的接口:
TransactionProxyFactoryBean:生成代理對象
TransactionInterceptor:實現對象的攔截
TransactionAttrubute:事務配置的數據
參考資料:https://blog.csdn.net/donggua3694857/article/details/69858827
https://blog.csdn.net/Java_3y/article/details/86711521
《高性能MySQL》