當你使用 @Transactional 時會發生什麼?
當你用 @Transactional 註解一個方法時會發生什麼事? @Transactional,Spring為被註解的類別建立一個代理類別。此代理類別會攔截外部方法呼叫並向其應用事務行為。
代理類別攔截
代理類別包含已註解的類別中宣告的方法的實作。當外部方法呼叫時,會被重定向到代理類別而不是原來的類別。然後,代理類別可以圍繞方法呼叫執行任何必要的預處理和後處理,包括事務管理。
自呼叫注意事項
僅限 Spring 的事務管理機制攔截外部方法呼叫。這意味著自呼叫(目標物件中的方法呼叫同一物件中的另一個方法)不會自動啟動事務。這是由於自呼叫繞過了代理機制。
可見代理類別
產生的代理類別可以使用反射來查看。您可以透過內省目標類別並檢索其聲明的類別來存取其資訊。代理類別一般以“$Proxy”為後綴。
為什麼只有外部呼叫?
事務下之所以只有外部方法呼叫是為了避免無限遞歸。如果自呼叫也啟動了事務,則可能會導致方法啟動新事務,然後呼叫自身並啟動另一個事務,依此類推,從而形成無限循環。
以上是Spring 的 @Transactional 註解如何管理事務以及為什麼它不能與自調用一起使用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!