第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をするのですか?
送金、送金、送金ロジックを開発すると、勘定科目番号の照会や、勘定科目に権限があるかどうかを確認するなど、重複するロジックがたくさんあります.だから私の同僚たちは継承を通じてコードを減らすことをお勧めします.
送金の概念は送金と送金の共通点であり,送金を親として作成し,送金と送金の子を用いて重複する関数を減らすことができると考えられる.
コード#コード#
プロジェクトから学んだこと
トランザクションを使用する理由
トランザクションの使用方法
トランザクション独立性レベル
プロジェクト内のターゲットテクノロジー
取引
個人的に挑戦する部分
コード再構築
コード可読性
Reference
この問題について(第2週(8 Percent)レビュー), 我々は、より多くの情報をここで見つけました https://velog.io/@earthkingman/원티드-프리온보딩-8Percentテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol