天天看點

spring 事務處理1. 事務處理簡介2. 事務的四大特性3. 聲明式事務管理實作4. 事務傳播特性5. spring事務隔離級别

目錄

  • 1. 事務處理簡介
  • 2. 事務的四大特性
    • 2.1 原子性
    • 2.2 一緻性
    • 2.3 隔離性
    • 2.4 持久性
  • 3. 聲明式事務管理實作
  • 4. 事務傳播特性
  • 5. spring事務隔離級别

1. 事務處理簡介

事務是一個業務,是一個不可分割的邏輯工作單元,具備ACID特性,實際工作中可借助Spring進行事務管理。

spring的事務子產品是通過AOP來實作的。Spring提供了兩種事務管理方式, 程式設計式事務和聲明式事務。程式設計式事務指的是通過編碼方式實作事務;聲明式事務基于 AOP,将具體業務邏輯與事務處了解耦。聲明式事務管理使業務代碼邏輯不受污染, 是以在實際使用中聲明式事務用的比較多。

2. 事務的四大特性

2.1 原子性

事務中的所有操作、所有SQL語句是一個整體,要麼全都執行成功,要麼全都執行失敗。

2.2 一緻性

事務前後的業務資料之和是保持不變的。例如存錢操作,存之前和存之後的總錢數應該是一緻的。

2.3 隔離性

事務與事務是互相隔離的,在隔離級别足夠高的情況下,事務和事務之間是完全隔離開來的。一個事務是看不到另外一個事物正在進行中的操作。要麼看到另一個事物開始之前的狀态, 要麼看到事務結束之後的狀态。

2.4 持久性

持久性是指在事物送出後, 對資料的修改将會是永久的。

3. 聲明式事務管理實作

Spring中聲明式事務處理有兩種方式,一種是在配置檔案中做相關的事務規則聲明,另一種是基于@Transactional 注解的方式。

筆者喜歡用注解方式方式實作:

在類或方法上使用@Transactional注解告訴spring架構要在這個類或者這個方法執行時要添加事務控制。當 @Transactional 放在類上時,說明所有該類的公共方法都配置相同的事務屬性資訊。當 @Transactional 放在類上也放在方法上時,應用程式會以方法級别的事務屬性資訊來管理事務。

@Transactional注解的屬性:

● timeout 事務的逾時時間,預設值為-1,表示沒有逾時顯示。如果配置了具體時間,則超過該時間限制但事務還沒有完成,則自動復原事務。

● read-only指定事務是否為隻讀事務,預設值為 false;為了忽略那些不需要事務的方法,比如讀取資料,可以設定 read-only 為 true。

● rollback-for 用于指定能夠觸發事務復原的異常類型,如果有多個異常類型需要指定,各類型之間可以通過逗号分隔。

● no-rollback- for 抛出 no-rollback-for 指定的異常類型,不復原事務。

● isolation事務的隔離度,預設值采用 DEFAULT。

4. 事務傳播特性

事務傳播(Propagation)特性指不同業務(service)對象中的事務方法之間互相調用時,事務的傳播方式。

● Propagation.REQUIRED 如果沒有事務建立新事務,如果目前有事務參與目前事務。

● Propagation.REQUIRES_NEW 必須是新事務, 如果有目前事務, 挂起目前事務并且開啟新事務。

● Propagation.SUPPORTS 支援目前事務,如果目前沒有事務,就以非事務方式執行。

● Propagation.NOT_SUPPORTED 以非事務方式執行操作,如果目前存在事務,就把目前事務挂起。

● Propagation.NEVER 以非事務方式執行,如果目前存在事務,則抛出異常。

● Propagation.MANDATORY 使用目前的事務,如果目前沒有事務,就抛出異常。

● Propagation.NESTED 如果目前存在事務,則在嵌套事務内執行。如果目前沒有事務,則執行Propagation.REQUIRED類似的操作。

5. spring事務隔離級别

● ISOLATION_DEFAULT 這是一個PlatfromTransactionManager預設的隔離級别,使用資料庫預設的事務隔離級别。

● ISOLATION_READ_UNCOMMITTED(讀未送出資料)安全級别最低, 可能出現任何事務并發問題(比如髒讀、不可以重複讀、幻讀等),性能最好,但是不建議用。

● ISOLATION_READ_COMMITTED(讀已送出資料)防止髒讀,沒有處理不可重複讀,也沒有處理幻讀;

性能比REPEATABLE READ好,Oracle資料庫預設的隔離級别。

● ISOLATION_REPEATABLE_READ (可重複讀) 防止髒讀和不可重複讀,不能處理幻讀問題;

性能比SERIALIZABLE好。MySQL資料庫預設的隔離級别。

● ISOLATION_SERIALIZABLE(序列化)不會出現任何并發問題,因為它是對同一資料的通路是串行的,非并發通路的,性能最差。