Spring 事務初識(1)2018-08-22

一:事務的4個限定屬性(ACID)

1、原子性(Atomic) :對數據的修改要么全部執(zhí)行,要么全部不執(zhí)行。
2、一致性(Consistent) :在事務執(zhí)行前后,數據狀態(tài)保持一致性。
3、隔離性(Isolated) :一個事務的處理不能影響另一個事務的處理。
4、持續(xù)性(Durable) :事務處理結束,其效果在數據庫中持久化。

二:隔離性(Isolated)細分4個隔離級別:

1、讀未提交(read uncommitted):一個事務可以讀取另一個事2務沒有提交的數據。存在臟讀、不可重復讀、幻讀的問題。
2、讀提交(Read Committed):一個事務的操作結果只有在該事務提交之后,另一個事務才能讀取到。避免另臟讀,存在不可重復讀、幻讀的問題。
3、可重復讀(Repeatable Read):保證在一個事務中,對同一筆數據的讀取結果是相同的。避免另臟讀、不可重復讀,存在幻讀的問題。
4、序列化讀(Serializable):所以的事務是按順序執(zhí)行的。

臟讀、不可重復讀、幻讀:
臟讀:一個事務讀取了,另一個事務為提交的數據
不可重復讀:一個事務內對同一筆數據的多次讀取結果不同,不可重復讀的重點是修改。
幻讀:同樣一筆查詢在整個事務過程中多次執(zhí)行后,查詢所得的結果集是不一樣的?;米x針對的是多筆記錄。幻讀的重點在于新增或者刪除 (數據條數變化)

三、Spring事務的主要接口:

PlatformTransactionManager:界定事務的邊界

public interface PlatformTransactionManager {
    //獲取事務
    TransactionStatus getTransaction(@Nullable TransactionDefinition var1) throws TransactionException;
    //提交
    void commit(TransactionStatus var1) throws TransactionException;
    //回滾
    void rollback(TransactionStatus var1) throws TransactionException;
}

TransactionDefinition:負責定義事務的相關屬性

public interface TransactionDefinition {
    //獲取事務傳播類型
    int getPropagationBehavior();

    //獲取事務隔離級別
    int getIsolationLevel();

    //獲取事務超時時間
    int getTimeout();

    //事務的只讀性
    boolean isReadOnly();

    //獲取事務名稱
    String getName();

}

TransactionStatus:事務開啟之后后事務結束期間的事務狀態(tài)

public interface TransactionStatus extends SavepointManager, Flushable {
  // 是否是新的事物
    boolean isNewTransaction();
    // 是否有恢復點
    boolean hasSavepoint();
    //標記回滾當前事務
    void setRollbackOnly();
    //判斷當前事務是不是標記為回滾
    boolean isRollbackOnly();
    //刷新會話到數據庫
    void flush();
    // 是否已完成
    boolean isCompleted();
}

四:事務屬性:
事務的傳播屬性:

1、TransactionDefinition.PROPAGATION_REQUIRED: 如果當前存在事務,則加入該事務;如果當前沒有事務,則創(chuàng)建一個新的事務。

2、TransactionDefinition.PROPAGATION_SUPPORTS: 如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續(xù)運行。

3、TransactionDefinition.PROPAGATION_MANDATORY: 如果當前存在事務,則加入該事務;如果當前沒有事務,則拋出異常。
不支持當前事務的情況:

4、TransactionDefinition.PROPAGATION_REQUIRES_NEW: 創(chuàng)建一個新的事務,如果當前存在事務,則把當前事務掛起。

5、TransactionDefinition.PROPAGATION_NOT_SUPPORTED: 以非事務方式運行,如果當前存在事務,則把當前事務掛起。

6、TransactionDefinition.PROPAGATION_NEVER: 以非事務方式運行,如果當前存在事務,則拋出異常。
其他情況:

7、TransactionDefinition.PROPAGATION_NESTED: 如果當前存在事務,則創(chuàng)建一個事務作為當前事務的嵌套事務來運行;如果當前沒有事務,則該取值等價于TransactionDefinition.PROPAGATION_REQUIRED。

事務的隔離屬性:

1、TransactionDefinition.ISOLATION_DEFAULT: 使用后端數據庫默認的隔離級別,Mysql 默認采用的 REPEATABLE_READ隔離級別 Oracle 默認采用的 READ_COMMITTED隔離級別.
TransactionDefinition.ISOLATION_READ_UNCOMMITTED: 最低的隔離級別,允許讀取尚未提交的數據變更,可能會導致臟讀、幻讀或不可重復讀

2、TransactionDefinition.ISOLATION_READ_COMMITTED: 允許讀取并發(fā)事務已經提交的數據,可以阻止臟讀,但是幻讀或不可重復讀仍有可能發(fā)生

3、TransactionDefinition.ISOLATION_REPEATABLE_READ: 對同一字段的多次讀取結果都是一致的,除非數據是被本身事務自己所修改,可以阻止臟讀和不可重復讀,但幻讀仍有可能發(fā)生。

4、TransactionDefinition.ISOLATION_SERIALIZABLE: 最高的隔離級別,完全服從ACID的隔離級別。所有的事務依次逐個執(zhí)行,這樣事務之間就完全不可能產生干擾,也就是說,該級別可以防止臟讀、不可重復讀以及幻讀。但是這將嚴重影響程序的性能。通常情況下也不會用到該級別。

事務超時屬性(一個事務允許執(zhí)行的最長時間)

所謂事務超時,就是指一個事務所允許執(zhí)行的最長時間,如果超過該時間限制但事務還沒有完成,則自動回滾事務。在 TransactionDefinition 中以 int 的值來表示超時時間,其單位是秒。

事務只讀屬性(對事物資源是否執(zhí)行只讀操作)

事務的只讀屬性是指,對事務性資源進行只讀操作或者是讀寫操作。所謂事務性資源就是指那些被事務管理的資源,比如數據源、 JMS 資源,以及自定義的事務性資源等等。如果確定只對事務性資源進行只讀操作,那么我們可以將事務標志為只讀的,以提高事務處理的性能。在 TransactionDefinition 中以 boolean 類型來表示該事務是否只讀。

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 很多人喜歡這篇文章,特此同步過來 由淺入深談論spring事務 前言 這篇其實也要歸納到《常識》系列中,但這重點又...
    碼農戲碼閱讀 4,936評論 2 59
  • 事務: 事務是邏輯上的一組操作,要么都執(zhí)行,要么都不執(zhí)行。 事物的特性:(ACID) 原子性: 事務是最小的執(zhí)行單...
    n油炸小朋友閱讀 521評論 1 1
  • 事務有四個特性:ACID 原子性(Atomicity):事務是一個原子操作,由一系列動作組成。事務的原子性確保動作...
    jiangmo閱讀 1,301評論 0 7
  • 概要:2Spring事務管理接口(隔離級別,傳播行為)、3接口介紹、4回滾原理 Spring事務的本質其實就是數據...
    hedgehog1112閱讀 771評論 0 0
  • 青長大了,不再像以前那樣粘我了,我現在早已習慣了她的存在,仿佛,我們生下來就認識一般。早晨的第一束陽光透過...
    松鼠君的草藥包閱讀 255評論 0 0

友情鏈接更多精彩內容