在使用spring框架時,可以有兩種使用事務的方式,一種時編程式事務,一種是申明式事務,@Transactional注解就是申明式的。
首先,事務這個概念式數據庫層面的,Spring只是基於數據庫中的事務進行了擴展,以及提供了一些能讓程序員更加方便操作事務的方式。
比如我們可以通過在某個方法上增加@Transaction注解,就可以開啟事務,這個方法中所有的sql都會在一個事務中執行,統一成功或者失敗。
在一個方法上加了@Transaction注解后,spring會基於這個類生成一個代理對象,會將這個代理對象作為bean,當在使用這個代理對象的方法時,如果這個方法上存在@Transaction注解,那么代理邏輯會先把事務的自動提交設置為false,然后再去執行原本的邏輯代碼,如果執行邏輯代碼沒有出現異常,那么代理邏輯中就會將事務進行提交,如果執行業務邏輯方法出現了異常,那么則會將事務進行回滾。
當然,針對哪些異常回滾事務是可以配置的,可以利用@Transaction注解中的rollbackFor屬性進行配置,默認情況下會對RuntimeException和Error進行回滾。
Spring事務隔離級別就是數據庫的隔離級別,外加一個默認級別
- 讀未提交
- 讀已提交
- 可重復讀
- 可串行化
數據庫的配置隔離級別是 讀已提交 而spring配置的隔離級別是 可重復讀 ,請問這時候以哪一個隔離級別為准?
以spring配置的為准,如果spring設置的隔離級別數據庫不支持,效果還是取決於數據庫。