概述spa
當咱們調用一個基於Spring的Service接口方法(如UserService#addUser())時,它將運行於Spring管理的事務環境中,Service接口方法可能會在內部調用其它的Service接口方法以共同完成一個完整的業務操做,所以就會產生服務接口方法嵌套調用的狀況, Spring經過事務傳播行爲控制當前的事務如何傳播到被嵌套調用的目標服務接口方法中。接口
事務傳播是Spring進行事務管理的重要概念,其重要性怎麼強調都不爲過。可是事務傳播行爲也是被誤解最多的地方,在本文裏,咱們將詳細分析不一樣事務傳播行爲的表現形式,掌握它們之間的區別。事務
事務傳播行爲種類ci
Spring在TransactionDefinition接口中規定了7種類型的事務傳播行爲,它們規定了事務方法和事務方法發生嵌套調用時事務如何進行傳播:get
表1事務傳播行爲類型it
事務傳播行爲類型io |
說明table |
PROPAGATION_REQUIREDclass |
若是當前沒有事務,就新建一個事務,若是已經存在一個事務中,加入到這個事務中。這是最多見的選擇。方法 |
PROPAGATION_SUPPORTS |
支持當前事務,若是當前沒有事務,就以非事務方式執行。 |
PROPAGATION_MANDATORY |
使用當前的事務,若是當前沒有事務,就拋出異常。 |
PROPAGATION_REQUIRES_NEW |
新建事務,若是當前存在事務,把當前事務掛起。 |
PROPAGATION_NOT_SUPPORTED |
以非事務方式執行操做,若是當前存在事務,就把當前事務掛起。 |
PROPAGATION_NEVER |
以非事務方式執行,若是當前存在事務,則拋出異常。 |
PROPAGATION_NESTED |
若是當前存在事務,則在嵌套事務內執行。若是當前沒有事務,則執行與PROPAGATION_REQUIRED相似的操做。 |
PROPAGATION_REQUIRES_NEW 啓動一個新的, 不依賴於環境的 "內部" 事務. 這個事務將被徹底 commited 或 rolled back 而不依賴於外部事務, 它擁有本身的隔離範圍, 本身的鎖, 等等. 當內部事務開始執行時, 外部事務將被掛起, 內務事務結束時, 外部事務將繼續執行.
PROPAGATION_NOT_SUPPORTED 外部方法的Transaction暫停直至innerMethod執行完畢