2022年3月21日


トランザクションが必要な理由


http://localhost:8080/contact/index.html

20文字以上の連絡先を登録


一つだけ

トランザクションを適用する前に


ml連絡先(連絡先テーブル)
11洪吉童[email protected]
エラー!電話番号が20桁を超えた!
エラー→メソッド呼び出しの終了→要求の処理の停止
その前に入力した値は変更されません.

データ処理中のエラーへの対応方法


データ変更の処理方法(入力、変更、削除)
①データ処理中、一部の操作が失敗しても、以前に実行した操作は承認される.
承認できる場合
途中でヒントを1つ送るだけでいいです.
一部の入力が規則に合わない
②データ処理において、一部の操作にエラーが発生した場合、前に行ったすべての操作をキャンセルしなければならない.
例)
座席の予約(決済失敗→予約キャンセル)
一部座席の予約に失敗→すべての予約をキャンセル
all or zero
すべて成功または失敗しなければならない
オーダー(支払失敗→オーダーのキャンセル)
すべてのデータ変更は正しく実行するか、すべてキャンセルする必要があります.
→取引が必要

トランザクションの適用後


🔹 ≪トランザクション|Transaction|oem_src≫:複数のデータ・アクション(入力、変更、削除)を組み合わせます.
データ操作
データ処理は単位で行われます.
単位にグループ化されたすべての操作が成功した場合は、DBに適用されます.
①取引発効前
今すぐ適用
②取引発効後
一括
テンポラリ・データベース
コミット前に保留
コミット後に実際のテーブルに適用
エラーなしで入力を完了したい場合は、次の操作を行います.
入力した操作を1単位に組み合わせる!

トランザクションの設定


Spring Bootトランザクション設定の検索
アプリケーションクラスの変更
トランザクションのアクティブ化
@EnableTransactionManagement // 애노테이션으로 트랜잭션을 제어할 수 있게 한다.

トランザクション・マネージャ・オブジェクトの準備
https://spring.io/projects/spring-framework#learn
  @Bean
  PlatformTransactionManager transactionManager(DataSource ds) {
    return new DataSourceTransactionManager(ds);
  }

正式提供:正式版
SNAPSHOT:開発バージョン
PRE:正式版が発売されます
絶対に5.3に移動できません

https://docs.spring.io/spring-framework/docs/current/reference/html/data-access.html#tx-prog-template

トランザクションの適用

@RestController 
public class ContactController {

  @Autowired
  ContactDao contactDao;


  @Autowired
  TransactionTemplate transactionTemplate;
スプリングで設定する方法

Springでのトランザクションの適用


35ページ
1.5.1. Using the TransactionTemplate
TransactionTemplateの使用方法
https://docs.spring.io/spring-framework/docs/current/javadoc-api/
doInTransaction
<<TransactionCallback>>
doInTransaction() {
  트랜잭션으로 묶어서 실행할 작업
}
🔹 TransactionTemplate:タスクの実行とトランザクションの制御
🔹 TransactionManager
• commit()
• rollback()
① excute(↑)
② TransactionTemplate ---call---> ↑
③ TransactionManager
正常運転を呼び出す→commit()
呼び出し異常→ロールバック()
オブジェクト向け:ロールを分割し、各クラスにロールを割り当てます.
クラス関係の迅速な決定が必要
このオブジェクトの役割をすばやく特定
https://docs.spring.io/spring-framework/docs/current/javadoc-api/






Spring Boot


スプリング起動は包装されています.
// Spring Boot
• 기본 설정 파일 => *.properties
• 기본 의존 라이브러리 => *.jar
• Web MVC => Spring Framework
• Servlet/JSP => Tomcat Server
スプリングガイドを使用せずに直接設定できます

サービス・オブジェクトの導入


ビジネス関連のコードとトランザクション関連のコードをカプセル化(個別に分離)
①移行方式
ContactController ---> ContactDao ---> MyBatis ---> JDBC Driver ---> DBMS
MyBatisはJDBC Driverカプセル化MyBatis内部コール.
非表示
ContactController
•分析要求パラメータ
•レスポンスデータの処理(JSON)
•ビジネスロジック+トランザクション制御
ml contactテーブル、ml cont telテーブルに挿入
=>分離によるメンテナンスの向上
②凱旋
ContactController
•分析要求パラメータ
•レスポンスデータの処理
ContactService
•ビジネスロジック
•取引管理
ContactController --call--> ContactService
分離要因
ビジネスロジックを分離し、他のコントローラでの再利用を容易にします.
このメソッドを現在の業界で使用
「DAOとテーブルの関係」の再注釈
DAOと表の関係

サービスオブジェクトとインタフェース


ContactController --call--> ContactService
顧客A ContactService
Aお客様が承認を希望する前に入力した情報は、連絡先登録時にエラーが発生しても承認されます.
お客様B ContactService
Bお客様は、連絡先登録時にエラーが発生した場合、前に入力したすべての情報をキャンセルしたいと考えています.
ビジネスロジックを独立したクラス(サービスオブジェクト)に分割します.
お客様によっては対応しやすいです.
改善事項!
コントローラで直接クラスを使用します.
ビジネスロジックが変化するたびに
クラスの変更が必要
=>メンテナンスが不便!
Contact Controllerは要求パラメータを処理する必要があります
离れた时に何が违うの...
データ処理はサービスで行います
後でコントローラオブジェクトとサービスオブジェクトを分けます
@Serviceの貼り付け
@Service
public class ContactService {

  @Autowired
  ContactDao contactDao;
ContactServiceTransaction
  @Autowired
  TransactionTemplate transactionTemplate;
@Service
public class ContactServiceTransaction {

  @Autowired
  ContactDao contactDao;

  @Autowired
  TransactionTemplate transactionTemplate;

Functional Interface:抽象的な方法を持つインタフェース
ランダ構文を適用するには、機能インタフェースを使用する必要があります.
executeの戻り値はdoInTransactionの戻り値と同じです
匿名の内部classをパラメータの位置に配置
ランダ構文を使用したトランザクション
2/35ページ目の90-MyList項目について
@Serviceがない場合、インスタンスは自動的に作成されません.

ここで変更するだけ
ContactServiceTransaction
ContactServiceNonTransaction
改善事項!
コントローラで直接クラスを使用します.
ビジネスロジックが変化するたびに
クラスの変更が必要
=>メンテナンスが不便!
解決策
インタフェース構文
1.5.3. Using the TransactionManager

トランザクション実行ポリシー


def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
PROPAGATION_REQUIRED
伝播ポリシー
caller (client)
発信者のような事務所に縛られる
例外が発生した場合は、以前に実行したすべての操作がキャンセルされます.
呼び出し元にトランザクションがない場合
呼び出し元がトランザクションに属していない場合は、新しいトランザクションを作成して実行します.
PROPAGATION_REQUIRES_NEW
Requires_New
Propagation.SUPPORT
support
Propagation.MANDATORY
Mandatory
Propagation.NOT_SUPPORT
Propagation.NEVER
トランザクションが存在する場合はエラー
通常はREQUIRDを使用します
DefaultTransactionDefinition 15年前のテクノロジー
事前に手配した2番の方法はTransactionTemplate(1番の方法)
もっと簡単な方法は@Transactional(第3の方法)
4つ目の方法はAOPです
コメントを追加する必要はありません

サービスオブジェクトへのインタフェースの適用


特定のクラスへの依存を減らすことができます
Contact Controller---使用--><<interface>> ContactService<<interface>> ContactService
ContactServiceNonTransaction
ContactServiceTransaction
ContactServiceTransaction2
ContactServiceTransaction3
中から適当に1つ差し込めばいいです
直接クラスを指定するのではなくインタフェースを指定すると、オブジェクトの置き換えが容易になります.
=>メンテナンスが容易

html template rendering
javascript template engine
JavaScriptからhtmlコードを削除
今日は13.3までです.