Spring -事務管理
Java事務導引
事務:正確執行一系列操作(或動作),使得數據庫從一種狀態轉移成另一種狀態,保證操作全部成功,或者全部失敗
事務原則:服從ISO/IEC指定的ACID原則
ISO/IEC:14443 識別卡 -- 非接觸式集成電路卡
原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)
DataSource
Java事務:在Java編寫的程序或者系統中,實現ACID的操作
實現範圍:
通過JDBC相應方法間接實現對數據庫的增刪改查,把事務轉移到Java代碼中控制,確保事務要麽全部執行成功,要麽撤銷不執行
總結:Java事務機制和原理就是確保數據庫操作的ACID特性
Java事務類型:
JDBC事務:Connection對象控制,包括手動模式和自動模式---------局限在一個數據庫連接,但是使用簡單
JTA(Java Transaction API)事務:與實現無關,與協議無關的API------------功能強大,可跨越數據庫或DAO,使用復雜
容器事務:應用服務器提供,且大多基於JAT完成(通常基於JNDI,API復雜)-----------J2EE應用服務器提供的事務管理,局限於EJB
Spring事務核心接口
PlatformTransactionManager接口
Spring事務屬性
是否是新事務(isNewTransaction)
是否有savepoint(診斷,NESTED):hasSavepoint
是否完成(isCompleted)
事務屬性範圍
事務屬性定義
事務讀取類型
臟讀
不可重復讀
幻讀
事務隔離級別(IsolationLevel)
spring事務傳播行為(PropagationBehavior)
事務是否只讀(isReadOnly)
Oracle的”readOnly”沒有作用,不影響增刪改查
MySQL的”readOnly”為true,只能查,增刪改拋出異常
事務超時(Timeout)
事務回滾
默認情況下,事務遇到運行期異常才會回滾,而在遇到檢查型異常不回滾
自定義:
1、 聲明事務在遇到特定的檢查型異常時像遇到運行時異常那樣回滾
2、 聲明事務在遇到特定的異常不回滾,即使是運行時異常
事務接口
通過事務管理器獲得TransactionAtatus實例
控制事務在回滾或者提交的時候需要應用對應的事務狀態
Spring事務接口
編程式事務管理
事務管理器(PlatformTransactionManager)
1、 類似應用JTA UserTransaction API方式,異常處理更簡潔
2、 核心類:spring事務管理的三個接口類以及JDBC template類
模板事務(TransactionTemplate)
JDBC Template類
編程事務步驟:
1、 需要有效的數據源,具體數據源根據實際情況創建
2、 創建編程事務管理對象
定義TransactionTemplate
使用TransactionTemplate
有返回值
沒有返回值
如果需要處理異常
3、 業務邏輯:基於JDBC template完成業務處理
聲明式事務管理(AOP)
XML方式配置
1、 添加schema
2、 定義事務管理器
3、 定義事務Advice
<tx:method/>
Name:匹配的函數名稱、支持*匹配
Propagation:事務傳播行為
Isolation:事務隔離級別
Timeout:超時
Read-only:是否只讀事務
Rollback-for:觸發回滾的異常,逗號分隔
No-rollback-for:不觸發回滾的異常,逗號分隔
4、 定義pointcut
註意:註入事務的類,還需要註入DataSource的屬性
註解方式配置
1、 添加schema
2、 定義事務管理器
3、@Transactional
value:使用的TransactionManager
propagation:事務傳播行為
isolation:事務隔離級別
timeout:超時
readOnly:是否只讀事務
RollbackFor:觸發回滾的異常類對象數組
RollbackForClassName:觸發回滾的異常類名稱數組
noRollbackFor:不觸發回滾的異常類對象數組
noRollbackForClassName:不觸發回滾的異常類名稱數組
配置類型:
5種:獨立代理;共享代理;攔截器;(這三種2.0版本之後不推薦使用)
Tx攔截器;全註釋
使用範圍
編程式事務在代碼量比較小的時候使用,聲明式事務在事務操作量多時候常常使用
Spring -事務管理