從這篇博文開始記錄Spring 事務管理的筆記,Spring 的聲明式事務管理是Spring的一大亮點,運用了Spring Aop技術使用戶能夠直接經過配置文件或者註解就能夠在方法上加上事務,讓編碼人員不須要再經過顯示的編寫事務代碼爲某些操做加上事務,同時Spring會提供了與底層事務無關的實物抽象,是用戶更換底層的持久化框架時,只須要更改少許配置就能夠繼續使用事務。
java
ps:這幾天工做比較忙,更新比較慢。。spring
瞭解Spring事務管理以前,首先須要瞭解什麼是事務,事務的思想能夠簡單的歸結爲「一榮俱榮,一損俱損」這句話,便可以將複數個對數據源的操做視爲一個總體,只有操做所有成功整個事務纔算成功,操做的結果纔會做用於數據源,若是操做有一個出錯失敗,整個事務將會回滾,全部操做都不會有效果。這只是事務的簡單解釋,嚴格的定義上事務必須知足四個特性:原子性(Atomic)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)
數據庫
原子性:即組成一個事務的多數據庫操做是一個不可再分割的原子單元(就是上面的總體概念)安全
一致性:因爲存在多個事務併發操做同一個數據源的狀況,必須保證數據的一致性多線程
隔離性:多個事務之間不能互相干擾,應該運行於不一樣的隔離空間(和多線程的線程安全相似)併發
持久性:一旦事務成功須要保證數據被持久化保存,即便發生突發事故,也要在事故處理後保證數據持久化框架
不一樣的數據庫對事務的支持並不相同,用戶能夠經過Connection#getMetaData()方法獲取DatabaseMataData對象,該對象的supportsTransaction()查看數據庫是否支持事務,用supportsTransactionIsolationLevel(int level)查看數據庫對某個隔離等級的支持。
編碼
JDBC默認是每條SQL都對應一個事務,想要多條SQL使用一個事務首先要關閉JDBC的自動提交,JDBC使用事務代碼:
spa
...... Connection conn; try{ conn = DriverManager.getConnection(); conn.setAutoCommit(false);//關閉自動提交 conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE); Statement stmt = conn.createStatement(); ......//執行一系列的SQL conn.commit(); } catch (Exception e) { ...... conn.rollback(); } finally { ...... }
JDBC3.0引入了保存點的功能,容許使用Connection#setSavepoint(String pointname)建立保存點,使用使用Connection#rollback(String pointname)回滾至某個保存點,保存點以前的內容不會被回滾,但並不是全部的數據庫都支持保存點,能夠經過DatabaseMetaData#supportsSavePoint()查看是否支持保存點。線程
Spring事務管理主要分爲三個接口PlatformTransactionManager、TransactionDefinition、TransactionStatus,都位於org.springframework.transaction包中。
TransactionDefinition主要用於Spring讀取了配置文件、註解後記錄事務的隔離級別、超時時間、是否爲只讀事務和事務傳播規則等信息
TransactionStatus表明一個具體的事務,繼承了SavepointManager接口(有建立保存點、回滾到保存點和釋放保存點等方法),同時TransactionStatus還擴展了boolean hasSavepoint()、boolean isNewTransaction()、boolean isCompleted()等能夠查詢事務狀態的方法,同時提供了 void setRollbackOnly()能夠設置事務爲rollback-only,從而使事務回滾
PlatformTransactionManager是全部事務管理器的父接口,提供了TransactionStatus getTransaction(TransactionDefinition definition)獲取事務,以及commit(TransactionStatus status)提交事務,rollback(TransactionStatus status)回滾事務