SSM框架(Spring+SpringMVC+MyBatis)之 Spring 事務、事務、事務
Spring事務的本質其實就是數據庫對事務的支持,沒有數據庫的事務支持,spring是無法提供事務功能的。真正的數據庫層的事務提交和回滾是通過binlog或者redo log實現的。
(1)Spring事務的種類:
spring支持編程式事務管理和聲明式事務管理兩種方式:
①編程式事務管理使用TransactionTemplate。
②聲明式事務管理建立在AOP之上的。其本質是通過AOP功能,對方法前後進行攔截,將事務處理的功能編織到攔截的方法中,也就是在目標方法開始之前加入一個事務,在執行完目標方法之後根據執行情況提交或者回滾事務。
聲明式事務最大的優點就是不需要在業務邏輯代碼中摻雜事務管理的代碼,只需在配置文件中做相關的事務規則聲明或通過@Transactional註解的方式,便可以將事務規則應用到業務邏輯中。
聲明式事務管理要優於編程式事務管理,這正是spring倡導的非侵入式的開發方式,使業務代碼不受污染,只要加上註解就可以獲得完全的事務支持。唯一不足地方是,最細粒度只能作用到方法級別,無法做到像編程式事務那樣可以作用到代碼塊級別。
(2)spring的事務傳播行爲:
spring事務的傳播行爲說的是,當多個事務同時存在的時候,spring如何處理這些事務的行爲。
① PROPAGATION_REQUIRED:如果當前沒有事務,就創建一個新事務,如果當前存在事務,就加入該事務,該設置是最常用的設置。(基本只用到第一個:REQUIRED)
② PROPAGATION_SUPPORTS:支持當前事務,如果當前存在事務,就加入該事務,如果當前不存在事務,就以非事務執行。‘
③ PROPAGATION_MANDATORY:支持當前事務,如果當前存在事務,就加入該事務,如果當前不存在事務,就拋出異常。
④ PROPAGATION_REQUIRES_NEW:創建新事務,無論當前存不存在事務,都創建新事務。
⑤ PROPAGATION_NOT_SUPPORTED:以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
⑥ PROPAGATION_NEVER:以非事務方式執行,如果當前存在事務,則拋出異常。
⑦ PROPAGATION_NESTED:如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則按REQUIRED屬性執行。
(3)Spring中的隔離級別:
① ISOLATION_DEFAULT:這是個 PlatfromTransactionManager
默認的隔離級別,使用數據庫默認的事務隔離級別。②
ISOLATION_READ_UNCOMMITTED:讀未提交,允許另外一個事務可以看到這個事務未提交的數據。③
ISOLATION_READ_COMMITTED:讀已提交,保證一個事務修改的數據提交後才能被另一事務讀取,而且能看到該事務對已有記錄的更新。④
ISOLATION_REPEATABLE_READ:可重複讀,保證一個事務修改的數據提交後才能被另一事務讀取,但是不能看到該事務對已有記錄的更新。⑤
ISOLATION_SERIALIZABLE:串行化,一個事務在執行的過程中完全看不到其他事務對數據庫所做的更新。