Spring中的事務控制

1.事務的概念

事務是一組操做的執行單元,相對於數據庫的單條操做而言,事務管理的是一組SQL指令,如增刪改查等,事務的特性體如今事務內包含的SQL指令必須所有執行成功,若是其中一條指令發生錯誤,那麼整個事務內的一組操做都要進行回滾。java

事務有四個特性:spring

  • 原子性 Atomic ,事務是一個不可再拆分的最小單位,要麼整個執行,要麼整個回滾.
  • 一致性 Consistent,事務要保證數據庫總體數據的完整性和業務的數據的一致性,事務成功提交總體數據修改,事務錯誤則回滾到數據回到原來的狀態。
  • 隔離性 Isolate,兩個事務的執行都是獨立的,事務以前不會相互影響,多個事務操做一個對象時會以串行等待的方式保證事務相互之間處於隔離。
  • 持久性 Durable,一旦事務成功提交後,數據將會保存到數據庫,不能再進行回滾,之後的操做都將在當前數據庫狀態上繼續進行。

2.Spring中的事務控制方式

  1. 編程式事務管理
    經過手動編碼控制事務的邊界,能夠實現細粒度的事務控制,通常用的較少。
  2. 聲明式事務管理
    只須要在Spring中添加一些配置文件或者使用註解,便可實現將操做歸入事務管理中,事務管理使用了Spring AOP,下降了代碼之間的耦合。

3.事務管理器

Spring中並無直接管理事務,而是將管理事務委託給相應的持久化機制提供的某個特定平臺的實現。sql

事務管理器實現 目標
org.springframework.jdbc.datasource.DataSourceTransactionManager 在單一的JDBC Datasource中管理事務
org.springframework.orm.hibernate5.HibernateTransactionManager 當持久化機制是hibernate時,用它來管理事務
org.springframework.jdo.JdoTransactionManager 當持久化機制是Jdo時,用它來管理事務
org.springframework.transaction.jta.JtaTransactionManager 使用一個JTA實現來管理事務。在一個事務跨越多個資源時必須使用
org.springframework.orm.ojb.PersistenceBrokerTransactionManager 當apache的ojb用做持久化機制時,用它來管理事務

4.事務屬性簡介

Spring關於事務的註解中有如下幾個屬性(部分)數據庫

@Transactional(
            readOnly = false, //讀寫事務
            timeout = -1,     //超時
            noRollbackFor = ArithmeticException.class  //遇到數學異常不回滾
            isolation = Isolation.REPEATABLE_READ,  //事務隔離級別
            propagation = Propagation.REQUIRED      //事務傳播規則
    )
  • 是否爲只讀事務:只讀事務不作任何修改,能夠優化查詢操做。
  • 事務超時(單位爲秒):事務的最長持續時間,若是該時間內事務一直沒有操做或回滾,則系統將自動進行回滾。-1表示不超時,但最終實現須要由底層數據庫實現。
  • 隔離級別:控制併發訪問下數據庫的安全性。
  • 傳播規則:定義事務方法和調用事務方法的方法之間的事務邊界。

5.事務傳播規則

傳播行爲 意義
REQUIRED 業務方法須要在一個事務中運行。若是方法運行時,已經處在一個事務中,那麼加入到該事務,不然爲本身建立一個新的事務
NOT_SUPPORTED 聲明方法不須要事務。若是方法沒有關聯到一個事務,容器不會爲它開啓事務。若是方法在一個事務中被調用,該事務會被掛起,在方法調用結束後,原先的事務便會恢復執行
REQUIRES_NEW 屬性代表無論是否存在事務,業務方法總會爲本身發起一個新的事務。若是方法已經運行在一個事務中,則原有事務會被掛起,新的事務會被建立,直到方法執行結束,新事務纔算結束,原先的事務纔會恢復執行
MANDATORY 該屬性指定業務方法只能在一個已經存在的事務中執行,業務方法不能發起本身的事務。若是業務方法在沒有事務的環境下調用,容器就會拋出異常
SUPPORTS 這一事務屬性代表,若是業務方法在某個事務範圍內被調用,則方法成爲該事務的一部分。若是業務方法在事務範圍外被調用,則方法在沒有事務的環境下執行
NEVER 指定業務方法絕對不能在事務範圍內執行。若是業務方法在某個事務中執行,容器會拋出異常,只有業務方法沒有關聯到任何事務,才能正常執行
NESTED 若是一個活動的事務存在,則運行在一個嵌套的事務中. 若是沒有活動事務, 則按REQUIRED屬性執行.它使用了一個單獨的事務, 這個事務擁有多個能夠回滾的保存點。內部事務的回滾不會對外部事務形成影響。它只對DataSourceTransactionManager事務管理器起效

6.事務隔離級別

隔離級別 意義
DEFAULT 默認的隔離級別
READ_UNCOMMITED 容許你讀取還未提交的改變了的數據。可能致使髒、幻、不可重複讀
READ_COMMITTED 容許在併發事務已經提交後讀取。可防止髒讀,但幻讀和 不可重複讀仍可發生
REPEATABLE_READ 對相同字段的屢次讀取是一致的,除非數據被事務自己改變。可防止髒、不可重複讀,但幻讀仍可能發生
SERIALIZABLE 徹底服從事務ACID的隔離級別,確保不發生髒、幻、不可重複讀。這在全部的隔離級別中是最慢的,它是典型的經過徹底鎖定在事務中涉及的數據表來完成的
  • 不一樣的隔離級別採用不一樣的方式來實現,在四種隔離級別中,Serializable的隔離級別最高,Read Uncommited的隔離級別最低。
  • 大多數據庫默認的隔離級別爲Read Commited,如SqlServer,Oracle
  • 固然也有少部分數據庫默認的隔離級別爲Repeatable_Read ,如Mysql,
  • Oracle數據庫支持READ COMMITTED和SERIALIZABLE兩種事務隔離性級別,不支持READ UNCOMMITTED和REPEATABLE READ這兩種隔離性級別。雖然SQL標準定義的默認事務隔離性級別是SERIALIZABLE,可是Oracle數據庫默認使用的事務隔離性級別倒是READ COMMITTED.

7.相關資料

相關文章
相關標籤/搜索