Spring事務的種類
編程式事務和聲明式事務
介紹一下編程式事務管理?
通過編程的方式顯式控制事務的開始、提交和回滾,一般使用TransactionTemplate的execute方法
介紹一下聲明式事務管理?
基于AOP,通過調用代理對象攔截目標方法,在方法執行前插入事務開始的橫切邏輯,在方法執行后根據執行情況來選擇提交還是回滾。不需要在業務邏輯中顯式的編寫事務相關的代碼,Spring 推薦通過 @Transactional 注解的方式來實現聲明式事務管理,也是日常開發中最常用的。
由于Spring AOP連接點類型的限制,最細粒度只能是方法級別。
Spring的事務傳播機制?
事務傳播機制定義了一個事務方法被另一個事務方法調用時的事務行為,這些行為定義了事務邊界和事務上下文如何在調用鏈中傳播。
默認是Required,也就是說如果當前存在事務,則加入當前事務,如果不存在,則新建事務。
事務傳播機制是通過ThreadLocal實現的,也就是說,如果調用事務的時候使用了一個新線程,則事務傳播機制失效
聲明式事務的實現原理了解嗎?
基于AOP和代理機制。
首先是在Bean的初始化階段創建目標類的代理對象
Spring容器在初始化單例Bean的時候,會遍歷所有的BeanPostProcessor實現類,并執行其 postProcessAfterInitialization 方法檢查這個Bean的類或方法上有沒有@Transactional,如果有的話,Spring就知道這個Bean需要事務增強,會為其通過JDK動態代理或者CGLIB代理生成一個代理對象,實際注入這個Bean的時候注入的是代理對象。
然后通過代理對象攔截需要被事務增強的目標方法,轉發到事務攔截器的invoke方法中,這個方法中會插入事務開啟、提交或回滾的橫切邏輯,是一種環繞增強。
聲明式事務在哪些情況下會失效?
如果 @Transactional 注解應用在非 public 修飾的方法上,Transactional 將會失效。
@Transactional 注解中的事務傳播機制屬性配置錯誤,默認是Required
@Transactional 注解中的rollbackFor屬性配置錯誤,默認是unchecked異常和Error下回滾
在同一個類中調用事務方法,因為只有在聲明@Transactional 注解的類外調用事務方法才能生成代理對象
一個事務方法調用另一個事務方法時,用try-catch捕獲了另一個事務方法的異常