1. 程式人生 > >關於資料庫事務的簡單總結

關於資料庫事務的簡單總結

資料庫事務有四個特性即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方式。