關於資料庫事務的簡單總結
資料庫事務有四個特性即ACID,具體分別是原子性,一致性,隔離性和永續性。事務如果在service層,那麼每個業務處理方法有自己的事務,一個事務中只連線了資料庫一次,有時候比如方法裡面有多個增刪改查這種情況,其實這也只連線了一次資料庫,並不是多次訪問資料庫,這個容易混淆。
再來看MySQL四種事務隔離級別,隔離級別由高到低分別為序列化,可重複度,讀已提交和讀未提交。事務隔離級別可以通過sql語句設定,設定資料庫的隔離級別一定要在開啟事務之前。MySQL的預設隔離級別是可重複度。
高度隔離會限制可並行執行的事務數,所以一些應用程式選擇降低隔離級別以換取更大的吞吐量。
如果資料庫事務沒有隔離會產生三個問題,分別為髒讀,不可重複度和幻讀。可以畫張圖對應一下關係。
事務執行的三種模式:
1.自定提交事務
2.顯式事務
3.隱性事務
關於Spring的事務管理:
原文連結:https://blog.csdn.net/wonabi/article/details/78059628
spring中管理方式的方式可分為兩種:程式設計式和宣告式事務。由於程式設計式事務使用較少(不符合spring習慣),故接下來重點闡述
宣告式事務,宣告式事務又可以分為XML配置方式和註解配置方式。在配置之前首先應該明確,spring中管理事務物件的依賴關係
如圖:
現在以配置JDBC的事務管理為例,分別演示用XML方式和註解方式配置宣告式事務。如下:
1.XML方式
步驟1.匯入AOP開發相關的包,因為XML方式配置就是基於AOP開發思想的
Spring-aop.jar; aspectJ.jar;spring-aspects.jar
步驟2.配置事務管理器,注意上圖,JDBC事務管理器依賴於DataSource存在,故在配置中需要體現此種關係
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean>
步驟3.配置事務的通知
<! -- 配置事務的增強 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<! --方法中可以配置的幾個屬性
isolation="DEFAULT" 隔離級別
propagation="REQUIRED" 傳播行為
read-only="false" 只讀
timeout="-1" 過期時間
rollback-for="" -Exception
no-rollback-for="" +Exception -->
<!-- 配置需要事務管理的方法,以轉賬方法為例-->
<tx:method name="transfer" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
步驟4.配置將通知織入目標
<aop:config>
<!--表示把事務織入到AccountServiceIml類中,所有以tranfer開頭的方法中-->
<aop:pointcut
expression="execution(*com.cai.transaction.AccountServiceImpl.transfer(..))" id="pointcut1"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/>
</aop:config>
註解方式
步驟1,導包和開啟事務管理與XML方式一致,不再累述。
步驟2.開啟註解管理事務
<! -- 開啟註解事務管理 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
步驟3.在使用的類中新增一個註解@Transactional
小結:對比以上兩種方式,可以得出一個結論,XML方式配置比較麻煩,但是比較統一,可以一次性解決問題。註解配置方式比較簡單,且比較靈活,可以在比較少事務管理的時候使用註解方式。在對專案要求嚴謹時,使用XML方式。