spring的事物對於同乙個類內部呼叫是不會生效的。
比如乙個servicea,裡面有個方法x()和y()。其中x沒有配置事物,而y配置的有實物。如果是乙個沒有事物的serviceb呼叫了servicea的x方法,而在x裡面直接通過this.y()的方式呼叫y方法。那麼y是不會有實物的,就算配置成propagation_required 也是不會有事物的。
反之,如果是沒有事物的serviceb先呼叫的servicea的y,而y又內部呼叫x這時候是有事物的。
原理很簡單,只有被spring託管的呼叫方式它才能在外層封裝事物。
execution(* com.aaa.somedao.*(..)) 第乙個* 號表示任意返回值,後面的*(..)表示任意引數
propagation_required 如果當前沒有事務,就新建乙個事務,如果已經存在乙個事務中,加入到這個事務中。這是最常見的選擇。
propagation_supports 支援當前事務,如果當前沒有事務,就以非事務方式執行。
propagation_mandatory 使用當前的事務,如果當前沒有事務,就丟擲異常。
propagation_requires_new 新建事務,如果當前存在事務,把當前事務掛起。
propagation_not_supported 以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
propagation_never 以非事務方式執行,如果當前存在事務,則丟擲異常。
propagation_nested 如果當前存在事務,則在巢狀事務內執行。如果當前沒有事務,則執行與propagation_required類似的操作。
我們系統啟動事物的方式是:先通過aspectjexpressionpointcutadvisor攔截,然後txadviser用org.springframework.transaction.interceptor.transactioninterceptor來管理事物。
spring事物傳播性
propagation propagation.required 如果有事務,那麼加入事務,沒有的話新建乙個 預設情況下 transactional propagation propagation.not supported 容器不為這個方法開啟事務 transactional propagatio...
spring事物傳播行為
propagation required 如果當前沒有事務,就新建乙個事務,如果已經存在乙個事務中,加入到這個事務中。這是最常見的選擇。propagation supports 支援當前事務,如果當前沒有事務,就以非事務方式執行。propagation mandatory 使用當前的事務,如果當前沒...
Spring的事物傳播行為
以下討論基於a.methoda 呼叫b.methodb 若b的事務隔離級別為 propagation required 外面影響裡面,裡面不影響外面 若a的方法沒有事務,則建立乙個新事務,若有事務,則加入當前事務。如果a的方法a丟擲異常,則a,b的方法都會回滾,如果b的方法b丟擲異常,則看a有沒有捕...