1. 程式人生 > >Spring_day03_2(Spring的宣告式事務屬性解讀&&事務的傳播)

Spring_day03_2(Spring的宣告式事務屬性解讀&&事務的傳播)

                                                                            宣告式事務屬性解釋
    	<!-- 具體哪些方法進行哪些控制 -->
    	<tx:attributes>
    	<!-- name:方法名稱,可是使用萬用字元,read-only:只讀,是否開啟事務  -->
    		<tx:method name="sel*" read-only="true"/>
    		<tx:method name="update*" read-only="false"/>
    		<tx:method name="del*" read-only="false"/>
    		<tx:method name="insert*" read-only="false"/>
    	</tx:attributes>

1. read-only=””
1.1 false 預設值,表示需要進行事務開啟和提交等,適用於增加,刪除,修改
1.2 True 表示只讀,不需要開始事務等操作,適用於查詢
2. rollback-for=”” 當切點中出現什麼型別異常時需要進行回滾.
2.1. 取值為型別全限定名稱
2.2 例如: rollback-for=”java.lang.Exception”
3. no-rollback-for=”” 當切點中出現什麼型別異常時不需要回滾.
4. Propagation=”” 事務傳播行為.
4.1 什麼樣情況下需要考慮事務傳播行為?
當一個有事務控制的方法,呼叫另一個有事務控制的方法時,出現了2個事務交叉的情況,控制兩個事務如何執行的過程就叫做事務傳播行為.
4.2 REQUIRED , 預設值.表示如果當前有事務,就在當前事務內執行.如果當前沒有事務,新建一個事務.
 
4.3 SUPPORT: 如果當前有事務就在事務中執行,如果當前沒有事務就在非事務狀態下執行.
4.4 MANDATORY:如果當前有事務就在事務中執行,如果當前沒有事務,拋異常.
 
4.5 REQUIRES_NEW:一定新建事務,如果當前已經有事務把當前事務掛起.
 
4.6 NOT_SUPPORTED:必須沒有事務,如果當前已經有事務,把當前事務掛起.
4.7 NEVER:必須沒有事務,如果當前已經有事務拋異常.
4.8 NESTED:如果當前有事務,新建一個巢狀子事務.
5. isolation=”” 事務隔離級別
5.1 什麼樣情況下需要考慮事務隔離級別?
當在多執行緒,高併發訪問情況下,需要考慮事務隔離級別.
   5.2 考慮事務隔離級別主要考慮的是如何保證資料的安全性.
   5.3 髒讀?
       5.3.1 事務A讀取到了事務B未提交的資料.事務A讀取到的資料叫做髒資料,讀取資料的過程叫做髒讀.
       5.3.2 在具備快取的情況下可能出現髒讀.
   5.4 不可重複讀?
       5.4.1 針對於表中一行資料或一行中某列資料.
       5.4.2 當事務A在修改一行資料時,沒有提交,事務B讀取到這行資料,事務B讀取的資料就是舊資料和以後的真實資料不一致.為了防止事務B讀取到未操作完成的資料的過程叫做不可重複讀.
   5.5 幻讀?
   
5.5.1 針對於整個表.
       5.5.2 幻讀: 事務A向表中新增一條資料,沒有提交事務,事務B查詢表中全部資料.事務B讀取到的資料和最終真實資料少一條,等讀取結束髮現讀取到的資料和真實資料不一樣,好像出現了幻覺一樣,所以叫做幻讀.

如何解決:isolation=""的取值

5.6 DEFAULT: 預設值. Spring不參與事務控制,事務控制取決於底層資料庫.

5.7 READ_UNCOMMITTED:可以讀取到未提交資料.可能出現髒讀,幻讀,不可重複讀.這種方式效率是最高的.

5.8 READ_COMMITTED: 只能讀取已經提交的資料.可以防止髒讀,但是可能出現不可重複讀,幻讀

5.9 REPEATABLE_READ: 如果有事務對某行資料進行操作,其他事務在讀取這行資料時必須等待正在操作的事務執行完畢,才能讀取.可以防止髒讀,不可重複讀.可能出現幻讀

5.10 SERIALIZABLE:對整個表進行加鎖,只有有事務在操作表,其他事務必須等待排隊.全能防止.但是效率是最低的.也是最安全的.