@Transactionalの原理


@Transactional


スプリングでトランザクションを管理する方法は抽象的です.@Transactionalを使用するとトランザクションが発生するためです.
私はこの魔法の内部を学びました.

Transaction動作原理


JDBC取引のコード

import java.sql.Connection; Connection connection = dataSource.getConnection(); // (1) 
try (connection) { connection.setAutoCommit(false);
 // (2) 
 // execute some SQL statements... 
 connection.commit(); 
 // (3)
  } catch (SQLException e) 
  { connection.rollback(); // (4) 
  }
  • データベースインタフェース
  • Javaでデータベース・トランザクションを開始する唯一の方法です.settAutoCommit(true)は、すべてのsql文をパッケージします.自動コミット、ロールバック
    falseは逆に、事務の主人は私です.つまり、私がコントロールして、欲しい内容に提出したりロールバックしたりします.
  • を発行します.
  • またはロールバック.もちろん、異常が発生した場合のみ
    これはjdbcの基本トランザクションメソッドであり、javaでトランザクションを開始する唯一のメソッドでもあるため、@Transactionalもそうします.
  • @Transactional(propagation=TransactionDefinition.NESTED, isolation=TransactionDefinition.ISOLATION_READ_UNCOMMITTED)
    
    重要なのは、トランザクション・独立性レベルが重なる場合の動作と比較して、独立性レベルが次の基本JDBCコードに整理されることです.

    Spring Transaction Managementの仕組み


    プログラミングスタイルのトランザクション管理方法.
    @Service 
    public class UserService { 
    @Autowired private 
    TransactionTemplate template;
    
     public Long registerUser(User user) { 
     Long id = template.execute(status -> { 
     // SQL 실행
      // ex) inserts the user into the db and returns the autogenerated id 
      return id; 
      });
      } 
      }
    
    前述したようにTransactionTemplateまたはPlatfromTransactionManagerを直接使用すればよい.
  • データベース・インタフェースは、直接開いたり閉じたりする必要はありません.トランザクションコールバックを使用します.
  • SQLEExceptionsをキャプチャする必要はありません.スプリングは、自動的にRuntimeExceptionに変換されます.
  • スプリング環境に適しており、TransactionTemplate内部ではPlatfromTransaction Managerが使用されています.Spring context configurationで
    これらは指定する必要がある空の値ですが、後で変更する必要はありません.
  • プログラミングの仕方が使いにくい.例にすぎない

    @Transactional使用時の内部コード

    public class UserService {
        public Long registerUser(User user) {
            Connection connection = dataSource.getConnection(); // (1)
            try (connection) { connection.setAutoCommit(false); 
                // (1) 
                // execute some SQL that e.g. 
                // inserts the user into the db and retrieves the autogenerated id 
                // userDao.save(user); <(2) 
                connection.commit(); // (1) 
                 } catch (SQLException e) {
                connection.rollback(); 
                // (1)
                }
        }
    }
    以上のように、@Transactionalは上のオブジェクトを管理するコードを自動的に挿入し、これらのオブジェクトの管理を支援します.

    上記のように、スプリングがコードを挿入する方法


    スプリングは基本的にiocを使用します.
    次に、上記のUserServiceをインスタンス化すると、クラスのトランザクションエージェントもインスタンス化されます.このようにCGIBライブラリ(プレゼンテーションエージェントモードでインタフェースクラスのないライブラリを適用)
    のヘルプでは、エージェントによってコードを挿入するように動作させます.
    すべてのトランザクション(open、commit、close)の処理は、エージェント自体ではなくトランザクションマネージャに委任されます.
    1.スプリングが@Transactionalを検出すると、空のダイナミックエージェントが生成されます.
    2.エージェント・オブジェクトは、トランザクション・マネージャへのアクセスを要求し、トランザクションまたは接続をオンまたはオフにします.
    3.取引マネージャはJDBC方式でコードを提供する.

    物理トランザクションと論理トランザクションの違い

  • 物理トランザクション:実際のJDBCトランザクション
  • 論理トランザクション:@Transactionalネストメソッド
  • @Transactional Propagtion Level


    取引の伝播のレベルには多くの種類がある.
  • リクエスト(エラー):メソッドにはトランザクション能力が必要です.新しい取引を開くか、既存の取引を使うか.
  • Support:トランザクションを開くかどうかにかかわらず、うまく実行できます:jdbcは何もしません.
  • Mandatory:自分でトランザクションを開くことはありませんが、誰もトランザクションを開かないことはできません=jdbcは何もしません.
  • Required new:完全に私のトランザクションに属する必要があります
  • Not Supported:すでに実行中のトランザクションがある場合は、停止=jdbcは何もしません.
  • Never:トランザクションを開始できません=jdbcは何もしません.
  • Nested:セーブポイントをキャプチャするセーブポイント
    その結果、jdbcが入るかどうかを理解するだけでよい.
  • @Transactional Isolation Level


    データベースの分離度は複雑なトピックです.トランザクション中に独立性レベルを切り替える場合は、まずデータベースまたはJDBCドライバがこの機能をサポートしているかどうかを明確にする必要があります.
    .エージェントを通過しない場合、すなわちiocに制御権を渡さずに@Transactional付きの内部メソッドを呼び出すと、ioc登録前にrochel時にエージェントが
    機能しないため、適用されません.
  • db独立性レベル
  • READ UNCOMMITTED
  • READ COMMITTED
  • REPEATABLE READ
  • SERIALIZABLE
    トランザクション間の孤立度が高いほど、パフォーマンスが低下します.
    一般的なオンラインサービスはREAD COMMITTEDまたはREPEATABLE READを使用する.
    (oracle = READ COMMITTED, mysql = REPEATABLE READ)
  • Springとjpa(hibernate)トランザクション管理動作

  • ハイバーネットはspring@Transactionを知らない.
  • springの@Transactionalは仮想トランザクションを知らない.
    私はそう思うことができますが、彼ら二人はお互いに知っています.どちらも唯一の方法jdbc基本方式を使用しているからです!
    しかし、お互いに認識できるように、スプリングとhyvernateの統合を実現しなければならない.
  • HibernateTransaction Managerの使用


    2つのトランザクション統合の問題を解決するには、DataSourcePlatformTransactionManagerではなくHibernateTransactionManagerを使用します.
    JPAでHibernateを使用する場合は、JpaTransactionManagerを使用できます.
    HibernateTransaction Managerは直接Hibernateを使用するときにトランザクションを管理し、JpaTransaction Managerはjpaを介して間接的に使用するときにトランザクションを管理します.
    事務を管理する.
    Spring-boot-start-data-jpaのようなライブラリを使用すると、springは自動的にJpaTransaction Managerを使用します.

    整理する


    どのテクノロジーを使用しても、JDBCベース(getConnection()、setAutoCommit(false)、commit()です.

    コメントサイト


    https://jeong-pro.tistory.com/228