1. 程式人生 > >spring事物深入瞭解

spring事物深入瞭解

1.問題

  1、以前對事物的瞭解只是停留在宣告式事物,配置xml,或使用註解,事物的傳播行為也只用過REQUIRED和SUPPORTS,可以說對事物的瞭解很模糊。

  2、直到在開發中遇到問題。。

    問題的描述是:

      年底跑定時任務,獲取使用者年底過期積分,併發送積分即將過期的訊息提示;

      過期積分做記錄,並與積分做關聯記錄,涉及兩表的操作;

      資料量較多,迴圈儲存,要做到每次迴圈都會手動提交,而不是做快取最後提交;

      事物的傳播行為為預設的REQUIRED,二兩個表操作涉及到了巢狀事物;

      So。。。

    解決辦法:

      採用了程式設計式事物

      事物的傳播行為選擇為:PROPAGATION_REQUIRES_NEW

public boolean updateExpireCredit(Credit credit) throws Exception {
        // 事務開始-方法級別
        DefaultTransactionDefinition def = new DefaultTransactionDefinition();
        // 傳播行為: 新建事務,如果當前存在事務,把當前事務掛起
        def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
        def.setTimeout(
30); // 事務狀態 TransactionStatus status = tm.getTransaction(def); boolean falg = false; try { creditRepository.save(credit); tm.commit(status); falg = true; } catch (Exception e) { e.printStackTrace(); log.error(
"出現異常,事務回滾:{}", e); if (!status.isCompleted()) { tm.rollback(status); } throw e; } return falg; }
View Code

 

2.事物的四個特性(ACID)

  • 原子性(Atomicity):事務是一個原子操作,由一系列動作組成。事務的原子性確保動作要麼全部完成,要麼完全不起作用。
  • 一致性(Consistency):一旦事務完成(不管成功還是失敗),系統必須確保它所建模的業務處於一致的狀態,而不會是部分完成部分失敗。在現實中的資料不應該被破壞。
  • 隔離性(Isolation):可能有許多事務會同時處理相同的資料,因此每個事務都應該與其他事務隔離開來,防止資料損壞。
  • 永續性(Durability):一旦事務完成,無論發生什麼系統錯誤,它的結果都不應該受到影響,這樣就能從任何系統崩潰中恢復過來。通常情況下,事務的結果被寫到持久化儲存器中。

3.spring事物管理

  PlatformTransactionManager

    jdbc——org.springframework.jdbc.datasource.DataSourceTransactionManager

    hibernate——HibernateTransactionManager

    jpa——org.springframework.orm.jpa.JpaTransactionManager

    java的jta——org.springframework.transaction.jta.JtaTransactionManager


 


4.事物屬性

  TransactionDefinition介面內容如下:

public interface TransactionDefinition {
    int getPropagationBehavior(); // 返回事務的傳播行為
    int getIsolationLevel(); // 返回事務的隔離級別,事務管理器根據它來控制另外一個事務可以看到本事務內的哪些資料
    int getTimeout();  // 返回事務必須在多少秒內完成
    boolean isReadOnly(); // 事務是否只讀,事務管理器能夠根據這個返回值進行優化,確保事務是隻讀的
}

4.1傳播行為

  

注:PROPAGATION_REQUIRES_NEW 和 PROPAGATION_NESTED 的最大區別在於, PROPAGATION_REQUIRES_NEW 完全是一個新的事務, 而 PROPAGATION_NESTED 則是外部事務的子事務, 如果外部事務 commit, 巢狀事務也會被 commit, 這個規則同樣適用於 roll back.

 4.2隔離級別

  併發事務所導致的問題

在同一個應用程式或者不同應用程式中的多個事務在同一個資料集上併發執行時,可能會出現許多意外的問題。

併發事務所導致的問題可以分為以下三類:

① 髒讀:髒讀發生在一個事務讀取了另一個事務改寫但尚未提交的資料時。如果改寫在稍後被回滾了,那麼第一個事務獲取的資料就是無效的

② 不可重複讀:不可重複讀發生在一個事務執行相同的查詢兩次或兩次以上,但是每次都得到不同的資料時。這通常是因為另一個併發事務在兩次查詢期間更新了資料

③ 幻讀:幻讀與不可重複讀類似。它發生在一個事務(T1)讀取了幾行資料,接著另一個併發事務(T2)插入了一些資料時。在隨後的查詢中,第一個事務(T1)就會發現多了一些原本不存在的記錄

注:

  不可重複讀的重點是修改

  幻讀的重點在於新增或者刪除

 

5.事物狀態

  PlatformTransactionManager介面的getTransaction()的方法得到的是TransactionStatus介面的一個實現,這個介面的內容如下:

public interface TransactionStatus{
    boolean isNewTransaction(); // 是否是新的事物
    boolean hasSavepoint(); // 是否有恢復點
    void setRollbackOnly();  // 設定為只回滾
    boolean isRollbackOnly(); // 是否為只回滾
    boolean isCompleted; // 是否已完成
}

6.程式設計時事物和宣告式事物

  https://blog.csdn.net/trigl/article/details/50968079#t7