Spring事務原理


一、事務の基本原理
Spring                  ,          ,spring          。   JDBC     ,      ,          :
  • 接続Connection con=DriverManager.get Connection()
  • を取得する.
  • オープンオフィスコンサート.set AutoCommt(true/false);
  • CRUD
  • を実行します.
  • 事務/ロールバック事務con.co mmit()/con.rollback();
  • 接続conn.close()を閉じます.Springの事務管理機能を使って、手順2と4のコードを書かなくてもいいです.Spirngで自動的に完成します.じゃSpringはどうやって私達が書いたCRUDの前と後で事務と事務を始めますか?この問題を解決すれば、Springの事務管理を全体的に理解することができます.以下では簡単に説明します.注釈方式は例です.プロファイルは注釈駆動を開始し、関連するクラスと方法には注釈@Transationによって識別されます.springは起動時に発生に関するbeanを解析します.この時に関連する注釈がある種類と方法を調べて、これらの種類と方法のために代理を生成して、@Transationの関連パラメータに基づいて関連した配置を注入して、代理の中で私達のために関連する事務を処理しました.本当のデータベース層の事務提出とロールバックはbinlogまたはredo logsによって実現されます.
  • 二、Spring事務の伝播属性
      spring       ,                  ,spring             。     TransactionDefinition   ,          :
    
    定数
    説明
    PROPAAGATION_REQUIRED
    現在の事務をサポートしていますが、現在の事務がない場合は、新しい事務を作成します.これは最も一般的な選択であり、Springのデフォルトのものの伝播でもある.
    PROPAAGATION_REQUIRES_NEW
    新しい事務を作って、現在の事務があれば、当面の事務を保留します.新規の事務は保留された事務と何の関係もありません.独立した二つの事務です.外部事務が失敗してロールバックした後、内部事務の実行結果をロールバックできません.
    PROPRERGATION_SUPPORTS
    現在の事務をサポートします.現在の事務がない場合は、非事務で行います.
    PROPAAGATION_MANDATORY
    現在の事務をサポートしていますが、今は仕事がないと異常を投げます.
    PROPRERGATION_NOT_SUPPORTED
    非事務方式で操作を行い、現在事務があれば、当面の事務を保留する.
    PROPRERGATION_NEVER
    非事務的に実行し、現在事務がある場合は異常を投げます.
    PROPRERGATION_NESTEP
    イベントのトランザクションが存在する場合は、ネストされたトランザクションで実行されます.イベントトランザクションがない場合は、REQUID属性で実行されます.これは単独の事務を使っています.この事務はロールバックできる保存点が複数あります.内部事務のロールバックは外部事務に影響を与えません.DataSourceTransation Manager事務マネージャだけに効果があります.
    三、データベースの隔離レベル
    隔離レベル
    レベル別の値
    招いた問題
    Read-Unicomitted
    0
    汚読をきたす
    Read-Commmitted
    1
    汚い読みを避けて、繰り返して読むことと幻読みを許可します.
    Repeapale-reed
    2
    汚い読みを避け、繰り返して読んではいけません.幻読みを許可します.
    Serrializable
    3
    シリアル化して読むと、事务は一つしか実行できません.汚い読みは避けられます.缲り返し読んではいけません.
  • 汚読:一つの事務はデータを削除しましたが、提出していません.もう一つの問題は未提出のデータを読み取ることができます.最初の仕事がこの時にロールバックしたら、二つ目の仕事は汚いデータを読みました.
  • 重複して読んではいけません.一つの事務では2回の読み取り操作があり、1回目の読み取りと2回目の操作の間に、もう一つの事務でデータが修正されています.この場合、2回目に読み取ったデータは一致しません.
  • 幻読み:第一の事務は一定範囲のデータを大量に修正し、第二の事務はこの範囲でデータを追加します.この場合、第一の事務は新規データに対する修正をなくします.
  • まとめ:隔離レベルが高いほど、データの整合性と整合性は保証されますが、同時性能に対する影響も大きいです.ほとんどのデータベースはデフォルトの分離レベルはRead Comitedで、例えばSql Server、Oracleです.
    少数のデータベースのデフォルトの分離レベルは、例えば、MySQL InnoDBのようなRepeable Readです.
    四、Springの隔離レベル
    定数
    説明
    ISO LATION_DEFAULT
    これはPlatofrom Transactionagerのデフォルトの分離レベルで、データベースのデフォルトの事務分離レベルを使用します.他の四つはJDBCの隔離レベルに対応しています.
    ISO LATION_READ_UNCOMMITTED
    これは事務の最低の隔離レベルであり、他の事務を担当しているので、この事務が未提出のデータを見ることができます.このような隔離レベルは汚い読みを生じ、繰り返して読んではいけません.
    ISO LATION_READ_COMMITTED
    一つの事務修正のデータを提出してから他の事務に読み込むことができます.もう一つのトランザクションは、当該トランザクションが未送信のデータを読み取ることができません.
    ISO LATION_REPEATABLE_READ
    このような事務レベルは汚れを防ぎ、繰り返して読んではいけません.でも幻像が出て読むかもしれません.
    ISO LATION_SERIALIZABLE
    これは最高の費用がかかりますが、最も信頼できる事務隔離レベルです.トランザクションは順次実行されるように処理される.
    五、事務の入れ子
    上記の理論的知識の下地を通して、データベース事務とspring事務のいくつかの属性と特徴を大体分かりました.次にいくつかのネストトランザクションの場面を分析して、spring事務の伝播のメカニズムを深く理解します.
          Service A Method A()    Service B Method B() 
    
    PROPAAGATION_REQUIRED(springデフォルト)
      ServiceB.methodB()        PROPAGATION_REQUIRED,     ServiceA.methodA()    spring      ,     ServiceB.methodB(),ServiceB.methodB()           ServiceA.methodA()      ,        。
    
       ServiceB.methodB()                ,            。  ,  ServiceA.methodA()     ServiceB.methodB()           ,       。
    
    PROPAAGATION_REQUIRES_NEW
           ServiceA.methodA()        PROPAGATION_REQUIRED,ServiceB.methodB()       PROPAGATION_REQUIRES_NEW。
           ServiceB.methodB()    ,ServiceA.methodA()          ,ServiceB.methodB()         ,   ServiceB.methodB()        ,      。
      PROPAGATION_REQUIRED                。   ServiceB.methodB()        ,             。   ServiceB.methodB()     ,   ServiceA.methodA()     ,ServiceB.methodB()       。   ServiceB.methodB()     ,          ServiceA.methodA()   ,ServiceA.methodA()         (   B        A      )。
    
    PROPAAGATION_SUPPORTS
      ServiceB.methodB()        PROPAGATION_SUPPORTS,      ServiceB.methodB() ,    ServiceA.methodA()         ,        ,    ServiceA.methodA()      ,         。    ,                   。
    
    PROPAAGATION_NESTEP
                 , ServiceB.methodB()           PROPAGATION_NESTED,              ?  ServiceB#methodB    rollback,       (  ServiceB#methodB)           SavePoint      (  ServiceA#methodA)            :
    
    a、捕獲異常、異常分岐論理を実行する
    void methodA() {
            try {
                ServiceB.methodB();
            } catch (SomeException) {
                //       ,   ServiceC.methodC();
            }
        }
                     ,            ,    ServiceB.methodB   ,      ServiceC.methodC(),  ServiceB.methodB             SavePoint,          (           ),                 ,   PROPAGATION_REQUIRED   PROPAGATION_REQUIRES_NEW           。
    
    b、外部事務のロールバック/提出
            ,         (ServiceB#methodB) rollback,      ServiceB.methodB           SavePoint(          ),     (  ServiceA#methodA)               commit    rollback
    
    他の三つの事務伝播属性はほとんど使えません.ここでは分析しません.
    六、まとめ
    プロジェクトの中で事務を使う必要があるところに対して、開発者はやはりspringのTransaction Callbackインターフェイスを使って事務を実現することを提案します.spring事務の注釈を盲目的に使わないでください.もし必ず注釈を使うならば、spring事務の伝播メカニズムと隔離レベルについて詳しく知る必要があります.
    七、注意すべき問題
    以下のいくつかの問題は注意に値する.
    1)          PROPAGATION_MANDATORY ,               。  ForumService#addTopic()   PROPAGATION_MANDATORY,      Action    addTopic()  ,       。      :addTopic()                  ( ForumService#otherMethod())。  PROPAGATION_MANDATORY                   。
    
    2)          PROPAGATION_NEVER ,                  。  UserService#addCredits()   PROPAGATION_NEVER, ForumService# addTopic()       ,addCredits()       。  PROPAGATION_NEVER           。
    
    3)       PROPAGATION_NOT_SUPPORTED ,             ,          ,           。          ,    ,          。
    
    4)        
    PROPAGATION_REQUIRES_NEW   PROPAGATION_NESTED             。PROPAGATION_REQUIRES_NEW       、        “  ”  。                ,        ,        。          ,        ,       ,         。
    
    PROPAGATION_NESTED      "   "   ,                  .          ,        savepoint.           ,         savepoint.              ,                .
    
        , PROPAGATION_REQUIRES_NEW  PROPAGATION_NESTED        :PROPAGATION_REQUIRES_NEW           ,            ,  PROPAGATION_NESTED                 ,           ,            。