22.04.13から22.04.14 WIL JDBCとTransaction


なぜ取引が必要ですか?


例えば2人でそれぞれ10万元あって、友達に送金する場合があります.
データベースはこのようにクエリーされます.
update member set money = 100000 - 30000 where member_id = ‘me’; 
update member set money =  100000 + 30000 where member_id = ‘you’;
クエリーが終了するたびに自動的にコミットされると(2行目にSQLExceptionが発生した場合)、「me」のお金は逃げてしまい、「you」はお金を受け取っていません.(大変なことになった!)
このように、ビジネスロジックが実行されると、タスクのように実行する必要があります.その役割は、アクションを安全に処理することです.

トランザクションACID

  • アトミック(Atomicity):トランザクションで実行されるすべての操作が成功または失敗する必要があります.
  • コンシステンシ:すべてのトランザクションが一貫したデータベース・ステータスを維持する必要があります.
  • 独立性(Isolation):同時に実行されるトランザクションを分離し、相互の影響を回避します.
  • 持続可能性:トランザクションが正常に完了した後、結果は常に記録される必要があります.
  • トランザクションの伝播


    トランザクション伝播は、ビジネスロジックのトランザクション範囲を定義します.
    Springは、伝播設定に基づいてトランザクションを管理します.

    トランザクションの伝播タイプ

  • REQUIRD:@Transactionalデフォルト値、トランザクションが使用可能な場合は新規
  • MANDATORY:呼び出す前に進行中のトランザクションが存在する必要があります.ない場合は例外
  • REQUIRDNEW:常に新しいトランザクションが開始し、既存のトランザクションが一時停止し、新しいトランザクションが再開され、その後、既存のトランザクションに復元されます
  • SUPPORTS:トランザクションは不要です.処理中のトランザクションがある場合は、そのトランザクション
  • を使用します.
  • NOT SUPPORTED:処理中の事務があっても使用しません.既存トランザクションの一時停止
  • NEVER:処理中のトランザクションが存在する場合、例外
  • が発生します.
  • NESTED:処理中のトランザクションが存在する場合は、ネストされたトランザクションで
  • を実行する必要があります.
    出典:Transactional propagation isolation

    トランザクション独立性レベル


    トランザクション・アイソレーションの成功度の測定
    独立性レベルが設定されていない場合は、使用するDBMSで設定したIsolation値に従います.
    出典:transaction-isolation-level

    PlatformTransactionManager


    次に、ビジネスロジックからTransactionが必要な理由と、それをどのように適用するかを理解しました.
    Transactionを使用するには、次のように記述します.
  • Autocommit = false
  • ビジネスロジックの実行
  • 正常運転時発行、異常時ロールバック
  • Transactionが完了すると、Autocommitをfalseに変更し、接続
  • に戻ります.
    ただし,JDBC,JPAなどのトランザクションを適用するコードは異なる.JDBCを使用するときにJPAに変更する必要がある場合は、上記のすべてのコードを変更する必要があります.これは恐ろしいことです.
    OCPの原則を遵守するためにSpringはPlatformTransactionMangerというインタフェースとして抽象化し、このインタフェースを通じてトランザクションを実現することができます.
    Spring Transaction Abstraction

    TransactionTemplate


    JdbcTemplateがTemplate CalbackメソッドでRepositoryセクションの重複コードを削除したように.
    TransactionもTransactionTemplateでサポートされています.
    TransactionTemplateの使用方法

    @Transactional


    @TransactionalはSpring AOPテクノロジーを使用したプレゼンテーションで、重複するコードを削除し、ビジネスロジックのみを記述するのに役立ちます.
    TransactionTemplateを使用すると、トランザクションは簡単に実行できますが、サービス層にはビジネスロジックに関係のないコードが含まれています.@transactionalを使用します.ビジネスロジックでコードを記述するしかありませんので、@transactionalを使用してください.
    追加
    TransactionTemplateを使用してトランザクションをプログラミングで管理
    @Transactional宣言トランザクション管理
    に表示されます.