Spring -12 -宣告式事務及完整的XML配置檔案資訊 -宣告式事務中的相關屬性(tx:advice的標籤)
1.程式設計式事務: 1.1由程式設計師程式設計事務控制程式碼. 1.2OpenSessionInView 就屬於程式設計式事務: session.commit()和rollback() 2.宣告式事務: 2.1事務控制程式碼已經由spring 寫好.程式設計師只需要宣告出哪些方法需要進行事務控制和如何進行事務控制. 3.宣告式事務都是針對於ServiceImpl 類下方法的. 4.事務管理器基於通知(advice)的. 5.在spring 配置檔案中配置宣告式事務
完整地XML配置檔案資訊:
<context:property-placeholderlocation="classpath:db.properties,classpath:second.pr operties"/> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverMa nagerDataSource"> <property name="driverClassName" value="${jdbc.driver}"></property> <property name="url" value="${jdbc.url}"></property> <property name="username" value="${jdbc.username}"></property> <property name="password" value="${jdbc.password}"></property> </bean> <!-- spring-jdbc.jar 中 --> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSour ceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 配置宣告式事務 --> <tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <!-- 哪些方法需要有事務控制 --> <!-- 方法以ins 開頭事務管理 --> <tx:method name="ins*" /> <tx:method name="del*" /> <tx:method name="upd*" /> <tx:method name="*" /> </tx:attributes> </tx:advice> <aop:config> <!-- 切點範圍設定大一些 --> <aop:pointcut expression="execution(* com.bjsxt.service.impl.*.*(..))" id="mypoint" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="mypoint" /> </aop:config>
宣告式事務中的相關屬性(tx:advice的標籤)
- name=”” 哪些方法需要有事務控制
1.1 支援*萬用字元
2.readonly=”boolean” 是否是隻讀事務.
2.1 如果為 true,告訴資料庫此事務為只讀事務.資料化優化,會對效能有一定提升,所以只要是查詢(select)的方法,建議使用此資料.
2.2 如果為 false(預設值),事務需要提交的事務.建議新增,刪除,修改.
3.propagation 控制事務傳播行為
3.1 定義: 當一個具有事務控制的方法被另一個有事務控制的方法呼叫後,需要如何管理事務(新建事務?在事務中執行?把事務掛起?報異常?)
3.2 REQUIRED (預設值): 如果當前有事務,就在事務中執行,如果當前沒有事務,新建一個事務.
3.3 SUPPORTS:如果當前有事務就在事務中執行,如果當前沒有事務,就在非事務狀態下執行.
3.4 MANDATORY: mandatory ,必須在事務內部執行,如果當前有事務,就在事務中執行,如果沒有事務,報錯.
3.5 REQUIRES_NEW:必須在事務中執行,如果當前沒有事務,新建事務,如果當前有事務,把當前事務掛起.
3.6 NOT_SUPPORTED:必須在非事務下執行,如果當前沒有事務,正常執行,如果當前有事務,把當前事務掛起(保證事務的獨立&&被回滾).
3.7 NEVER:必須在非事務狀態下執行,如果當前沒有事務,正常執行;
如果當前有事務,報錯.
3.8 NESTED:必須在事務狀態下執行.如果沒有事務,新建事務,如果當前有事務,建立一個巢狀事務.
4.isolation=”xxx” 事務隔離級別
4.1 定義:在多執行緒或併發訪問下如何保證訪問到的資料具有完整性的/合法的/對的.
4.2 髒讀:
4.2.1 一個事務(A)讀取到另一個事務(B)中未提交的資料(暫存在快取中的未提交到資料庫的資料),另一個事務中資料可能進行了改變,此時A 事務讀取的資料可能和資料庫中資料是不一致的,此時認為資料是髒資料,讀取髒資料過程叫做髒讀.
4.3 不可重複讀:
4.3.1 主要針對的是某行資料.(或行中某列)
4.3.2 主要針對的操作是修改操作.
4.3.3 兩次讀取在同一個事務內
4.3.4 當事務A 第一次讀取事務後,事務B 對事務A 讀取的資料進行修改,事務 A 中再次讀取的資料和之前讀取的資料不一致,過程不可重複讀.
4.4 幻讀:
4.4.1 主要針對的操作是新增或刪除
4.4.2 兩次事務的交叉處理的結果.
4.4.3 事務A 按照特定條件查詢出結果,事務B 新增了一條符合條件的資料.事務 A 中查詢的資料和資料庫中的資料不一致的,事務A 好像出現了幻覺,這種情況稱為幻讀.
4.5 DEFAULT: 預設值,由底層資料庫自動判斷應該使用什麼隔離界別
4.6 READ_UNCOMMITTED: 可以讀取未提交資料,可能出現髒讀,不重複讀,幻讀.
4.6.1 效率最高.
4.7 READ_COMMITTED:只能讀取其他事務已提交資料.可以防止髒讀,可能出現不可重複讀和幻讀.
4.8 REPEATABLE_READ: 讀取的資料被新增鎖,防止其他事務修改此資料,可以防止不可重複讀.髒讀,可能出現幻讀.
4.9 SERIALIZABLE: 排隊操作,對整個表新增鎖.一個事務在操作資料時,另一個事務等待事務操作完成後才能操作這個表.
4.9.1 最安全的,銀行,金融類;
4.9.2 效率最低的.
5.rollback-for=”異常型別全限定路徑” (java.lang.Exception)
5.1 當出現什麼異常時需要進行回滾
5.2 建議:給定該屬性值.
5.2.1 手動拋異常一定要給該屬性值,throw new Exception();
6.no-rollback-for=””
6.1 當出現什麼異常時不滾回事務.