Spring難以理解的問題總結
1、Spring事務傳播機制
Spring在TransactionDefinition介面中規定了7種類型的事務傳播行為,它們規定了事務方法和事務方法發生巢狀呼叫時事務如何進行傳播,
即協調已經有事務標識的方法之間的發生呼叫時的事務上下文的規則(是否要有獨立的事務隔離級別和鎖)
概述
當我們呼叫一個基於Spring的Service介面方法(如UserService#addUser())時,它將運行於Spring管理的事務 環境中,Service介面方法可能會在內部呼叫其它的Service介面方法以共同完成一個完整的業務操作,因此就會產生服務介面方法巢狀呼叫的情況, Spring通過事務傳播行為控制當前的事務如何傳播到被巢狀呼叫的目標服務介面方法中。
事務傳播是Spring進行事務管理的重要概念,其重要性怎麼強調都不為過。但是事務傳播行為也是被誤解最多的地方,在本文裡,我們將詳細分析不同事務傳播行為的表現形式,掌握它們之間的區別。
事務傳播行為種類
Spring在TransactionDefinition介面中規定了7種類型的事務傳播行為,它們規定了事務方法和事務方法發生巢狀呼叫時事務如何進行傳播:
表1事務傳播行為型別
事務傳播行為型別 | 說明 |
PROPAGATION_REQUIRED | 如果當前沒有事務,就新建一個事務,如果已經存在一個事務中,加入到這個事務中。這是最常見的選擇。 |
PROPAGATION_SUPPORTS | 支援當前事務,如果當前沒有事務,就以非事務方式執行。 |
PROPAGATION_MANDATORY | 使用當前的事務,如果當前沒有事務,就丟擲異常。 |
PROPAGATION_REQUIRES_NEW | 新建事務,如果當前存在事務,把當前事務掛起。 |
PROPAGATION_NOT_SUPPORTED | 以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。 |
PROPAGATION_NEVER | 以非事務方式執行,如果當前存在事務,則丟擲異常。 |
PROPAGATION_NESTED | 如果當前存在事務,則在巢狀事務內執行。如果當前沒有事務,則執行與PROPAGATION_REQUIRED類似的操作。 |
當使用PROPAGATION_NESTED時,底層的資料來源必須基於JDBC 3.0,並且實現者需要支援儲存點事務機制。