https://blog.csdn.net/bigtree_3721/article/details/53966617.net
所謂事務傳播行爲就是多個事務方法相互調用時,事務如何在這些方法間傳播。Spring支持7種事務傳播行爲線程
一、PROPAGATION_REQUIRED(加入已有事務)blog
若是當前沒有事務,就新建一個事務,若是已經存在一個事務中,加入到這個事務中。這是最多見也是默認的方式。事務
二、PROPAGATION_SUPPORTS(跟隨環境)程序
支持當前事務,若是當前沒有事務,就以非事務方式執行。方法
三、PROPAGATION_MANDATORY(須要事務)d3
使用當前的事務,若是當前沒有事務,就拋出異常。異常
四、PROPAGATION_REQUIRES_NEW(獨立事務)vi
新建事務,若是當前存在事務,把當前事務掛起。工作
五、PROPAGATION_NOT_SUPPORTED(非事務方式)
以非事務方式執行操做,若是當前存在事務,就把當前事務掛起。
六、PROPAGATION_NEVER(排除事務)
以非事務方式執行,若是當前存在事務,則拋出異常。
七、PROPAGATION_NESTED(嵌套事務)
若是當前存在事務,則在嵌套事務內執行。若是當前沒有事務,則執行與PROPAGATION_REQUIRED相似的操做。
Spring默認的事務傳播行爲是PROPAGATION_REQUIRED,它適合於絕大多數的狀況。假設ServiveX#methodX()都工做在事務環境下(即都被Spring事務加強了),假設程序中存在以下的調用鏈:Service1#method1()->Service2#method2()->Service3#method3(),那麼這3個服務類的3個方法經過Spring的事務傳播機制都工做在同一個事務中。
若是在一個ServiceA和a()方法中啓動一個線程,在這個新建立的線程中執行ServiceB的事務方法b()。在相同線程中進行相互嵌套調用的事務方法工做於相同的事務中。若是這些相互嵌套調用的方法工做在不一樣的線程中,不一樣線程下的事務方法工做在獨立的事務中。