第2週(8 Percent)レビュー


回顧録


プロジェクトスケジュール



どのようにしてお金の完全性を維持することができますか?



AはBに10000元をネットバンクに送金する.
では、Aの口座から10000元を差し引いて、Bの口座から10000元を増やし、未知のエラーでAの口座から10000元を減らしますが、Bの口座に10000元を増やさないと、Aの10000元は消えてしまいます.これらのエラーを回避するにはどうすればいいですか?

問題の原因


取引がエラーで停止した場合、以前に発生した取引は元の状態に戻らないからです.

解決策


トランザクションの使用

トランザクションとは?


トランザクション(Transaction)は、論理機能を実行してデータベースの状態を変換する操作を行うユニット、または同時に実行する必要がある操作のセットです.
データベース内の複数のタスクが同じデータを同時に処理すると、これらのタスクを互いに分離する単位になります.

注意事項


  • Select文とUpdate文が必要な場所でのみ使用します.お金などの重要なビジネスで使用されるテーブルのデータ変更を制御する必要がある場合にのみ使用します.

  • 盲目的なトランザクションは、システムリソースを削減し、ロックによってシステムが中断します.
    トランザクション:DBMSでデータを処理する論理操作ユニット
    トランザクションを使用する理由は、データベースでデータを処理するときに障害が発生すると、データ操作を繰り返す単位になるためです.
  • アプリケーションアイテム


    送金(送金)API


     async remit(updateWithdrawInfo: UpdateWithRemitDto, user: number): Promise<any> {
            const { withdrawAmount, toAccountNumber, fromAccountNumber } = updateWithdrawInfo;
            // 해당 출금 계좌 정보 조회
            const fromAccount = await this.findByAccountNumber(fromAccountNumber);
            // 해딩 입금 계좌 정보 조회
            const toAccount = await this.findByAccountNumber(toAccountNumber);
            // 해당 출금 계좌 권한 조회
            const auth = await this.authCheck(fromAccount.id, user);
            // queryRunner 설정 -> 트랜잭션을 사용하는 방법 중 하나
            const queryRunner: QueryRunner = this.connection.createQueryRunner();
            await queryRunner.connect();
            await queryRunner.startTransaction();
            try {
                // 해당 출금 계좌 잔액 조회 
                const exFromAccount: Account = await this.balanceCheck(queryRunner, fromAccount, withdrawAmount);
                // 해당 입금 계좌 잔액 조회
                const exToAccount: Account = await this.balanceCheck(queryRunner, toAccount, withdrawAmount);
                // 해당 출금 계좌 거래 가능 조회
                const amountAfterTransaction: number = await this.confirmTradable(exFromAccount, withdrawAmount);
                // 출금 내역 생성 및 정산
                const withdraw = await this.withdraw(queryRunner, exFromAccount, withdrawAmount, amountAfterTransaction);
                // 입금 내역 생성 및 정산
                const deposit = await this.deposit(queryRunner, exToAccount, withdrawAmount);
                this.interlink(queryRunner, withdraw, deposit);
                await queryRunner.commitTransaction();
                return REMITTANCE_SUCCESS_MSG(fromAccountNumber, toAccountNumber, withdrawAmount, amountAfterTransaction);
            } catch (error) {
                console.error(error);
                await queryRunner.rollbackTransaction();
                throw error;
            } finally {
                await queryRunner.release();
            }
        }

    結果


    せいじょうしょり

    Commit

    エラー

    Rollback

    なぜCode Refactoringをするのですか?


    送金、送金、送金ロジックを開発すると、勘定科目番号の照会や、勘定科目に権限があるかどうかを確認するなど、重複するロジックがたくさんあります.だから私の同僚たちは継承を通じてコードを減らすことをお勧めします.

    送金の概念は送金と送金の共通点であり,送金を親として作成し,送金と送金の子を用いて重複する関数を減らすことができると考えられる.
    コード#コード#

    プロジェクトから学んだこと


    トランザクションを使用する理由
    トランザクションの使用方法
    トランザクション独立性レベル

    プロジェクト内のターゲットテクノロジー


    取引

    個人的に挑戦する部分


    コード再構築
    コード可読性