一、事務(wù)的基本原理
Spring事務(wù)的本質(zhì)其實就是數(shù)據(jù)庫對事務(wù)的支持,沒有數(shù)據(jù)庫的事務(wù)支持,spring是無法提供事務(wù)功能的。對于純JDBC操作數(shù)據(jù)庫,想要用到事務(wù),可以按照以下步驟進(jìn)行:
獲取連接 Connection con = DriverManager.getConnection()
開啟事務(wù)con.setAutoCommit(true/false);
執(zhí)行CRUD
提交事務(wù)/回滾事務(wù) con.commit() / con.rollback();
關(guān)閉連接 conn.close();
使用Spring的事務(wù)管理功能后,我們可以不再寫步驟 2 和 4 的代碼,而是由Spirng 自動完成。?那么Spring是如何在我們書寫的 CRUD 之前和之后開啟事務(wù)和關(guān)閉事務(wù)的呢?解決這個問題,也就可以從整體上理解Spring的事務(wù)管理實現(xiàn)原理了。下面簡單地介紹下,注解方式為例子
配置文件開啟注解驅(qū)動,在相關(guān)的類和方法上通過注解@Transactional標(biāo)識。
spring 在啟動的時候會去解析生成相關(guān)的bean,這時候會查看擁有相關(guān)注解的類和方法,并且為這些類和方法生成代理,并根據(jù)@Transaction的相關(guān)參數(shù)進(jìn)行相關(guān)配置注入,這樣就在代理中為我們把相關(guān)的事務(wù)處理掉了(開啟正常提交事務(wù),異常回滾事務(wù))。
真正的數(shù)據(jù)庫層的事務(wù)提交和回滾是通過binlog或者redo log實現(xiàn)的。
二、Spring 事務(wù)的傳播屬性
所謂spring事務(wù)的傳播屬性,就是定義在存在多個事務(wù)同時存在的時候,spring應(yīng)該如何處理這些事務(wù)的行為。這些屬性在TransactionDefinition中定義,具體常量的解釋見下表: