java事務基礎

java事務

1.概念
2.分類
3.聲明式事務實現
4.執行流程
5.@Transactional註解
6.注意事項
7.事務傳播機制
8.事務隔離

1.概念

事務管理是企業級應用程序開發中必不可少的技術,用來確保數據的完整性和一致性;

事務必須服從ACID原則。ACID指的是原子性(atomicity)、一致性(consistency)、隔離性(isolation)和持久性(durability)。

原子性:操作這些指令時,要麼全部執行成功,要麼全部不執行。只要其中一個指令執行失敗,所有的指令都執行失敗,數據進行回滾,回到執行指令前的數據狀態。
一致性:事務的執行使數據從一個狀態轉換爲另一個狀態,但是對於整個數據的完整性保持穩定。
隔離性:在該事務執行的過程中,無論發生的任何數據的改變都應該只存在於該事務之中,對外界不存在任何影響。只有在事務確定正確提交之後,纔會顯示該事務對數據的改變。其他事務才能獲取到這些改變後的數據。
持久性:當事務正確完成後,它對於數據的改變是永久性的。


2.分類

編程式事務管理:

將事務管理代碼嵌入到業務方法中來控制事務的提交和回滾,在編程式管理事務中,必須在每個事務操作中包含額外的事務管理代碼。

聲明式事務管理:

大多數情況下比編程式事務管理更好用,它將事務管理代碼從業務方法中分離出來,以聲明的方式來實現事務管理,Spring聲明式事務管理建立在AOP基礎之上,是一個典型的橫切關注點,通過環繞增強來實現,其原理是對方法前後進行攔截,然後在目標方法開始之前創建或加入一個事務,在執行完畢之後根據執行情況提交或回滾事務。

我們着重介紹聲明式事務管理


3.聲明式事務實現

1、添加spring-aspects-4.3.10.RELEASE.jar包

2、在Spring配置文件中添加如下配置:

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>

<!-- 啓用事務註解 -->
<tx:annotation-driven transaction-manager="transactionManager"/>

3.在Service層public方法上添加事務註解——@Transactional


4.執行流程

容器在剛開始掃描時,會爲帶有@Transactional註解的public方法創建代理對象,進行事務管理。

當執行到這個方法的時候,如果拋出了運行時異常,則事務回滾,如果沒有拋出異常或者拋出的是檢查時異常,則事務提交。


5.@Transactional註解

1.rollbackFor 屬性:指定對哪些異常回滾事務。

即使是檢查時異常,如果我們需要讓這個事務回滾,可以爲註解該屬性設置值,值爲異常類,這樣在拋出檢查時異常時同樣可以回滾。

@Transactional(rollbackFor=Exception.class)

2.noRollbackFor 屬性:指定對哪些異常不回滾事務。

與上面類似,如果需要在拋出運行時異常時也不讓事務回滾,爲註解該屬性設置值,值也爲異常類,這樣在拋出運行時異常時也不會回滾,成功提交。

@Transactional(noRollbackFor=RuntimeException.class)

3.readOnly 屬性:指定是否對數據庫進行只讀操作。

該屬性的值爲boolean類型,默認爲false,即可對數據庫進行讀寫操作,如果指定屬性爲true,則將只能對數據庫進行讀操作,否則將會拋出異常保證了一定的安全性。

@Transactional(readOnly=true)

4.timeout 屬性:方法執行的最大時間。

該屬性的值單位爲秒,即如果該方法執行時間超過此設置的值,事務將提交失敗,自動回滾。

@Transactional(timeout=2)

6.注意事項

1.不能在protected、默認或者private的方法上使用@Transactional註解,否則無效。

2.方法中的如果拋出的異常被 try-catch 處理,那麼相當於未檢測到拋出了異常,仍會提交事務。


7.事務傳播機制

propagation 也是@Transactional註解中的一個屬性,但是它代表的是一種傳播機制,因此單獨拿出來談。
有兩種常用的傳播方式:REQUIREDREQUIRES_NEW

通過簡單的例子來了解這兩種行爲:
方法A調用方法B,兩個方法的事務傳播屬性均爲x,當x分別爲這兩種值時,會有不同的情況出現。

REQUIRED:(默認值)如果有事務在運行,當前的方法就在這個事務內運行,否則以非事務的方式運行;
由於兩個方法處於一個事務 ,只要有一個方法中拋出運行時異常,兩個方法都會回滾。

REQUIRES_NEW:當前方法必須啓動新事務,並在它自己的事務內運行,如果有事務在運行,則把當前事務掛起,直到新的事務提交或者回滾才恢復執行。
由於在不同的事務內運行,就互不相關,哪一個方法拋出運行時異常就回滾哪個方法,而另一個方法並不會收到影響。


8.事務隔離

隔離級別共五個級別,它們代表着不同事務對於相同數據的讀寫操作時處理的機制。

1. Read uncommitted (讀未提交)
當事務A在事務中處理數據1時,如果事務B訪問數據1,不管事務A是否提交,事務A對數據1修改成什麼樣子,事務B訪問數據1的值就是什麼樣子。

2.Read committed (讀提交)
當事務A在事務中處理數據1時,會將數據1所在行鎖住。如果事務B訪問數據1,如果事務A未提交,事務B訪問到的就是數據1在被事務A處理之前的值,如果事務A已提交,事務B訪問到的就是數據1在被事務A處理後的值。

3.Repeatable read (重複讀)
當事務A在事務中更新數據1時,會將數據1所在表鎖住。如果事務B在數據1所在表添加信息數據2時,如果事務A未提交,事務B將無法添加,因此此張表已被鎖住,如果事務A已提交,事務B即可添加。

4.Serializable (序列化 )
當事務A在事務中訪問數據1時,不管是否更新數據1,事務B均無法訪問數據1所在表上的任何數據,很顯著的缺點就是併發行極低。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章