[Rails] 여러 DB 처리를 취합한transsaction

개시하다


Rails 개발 애플리케이션을 통해 여러 테이블을 동시에 작성하는 데이터 처리가 가능합니다.
이 처리에서 어떤 처리가 실패한 상황에서 쌍방의 처리를 하지 않는transsaction이라는 개념을 알고 비망록 겸 출력으로transation과 실시한 내용을 기술한다.

이른바 transation


"transaction"이라는 단어의 정의를 찾아보세요.
[처리, 처리, 처리, 업무, 거래, 매매, 회보, 기요, 의사록] 위에서 말한 바와 같다.
IT 및 프로그래밍
"여러 처리를 한데 모아서 분할할 수 없습니다."
라는 정의를 내렸다.
이 글은 거래의 개념을 총결하여 매우 이해하기 쉬우니 참고하도록 제공한다.
거래란?아주 쉽게 말했어!

transaction 방법 사용 방법

  • 다중 처리를 하나의 통합 처리로 처리
  • 처리에 실패하면 전체 트랜잭션이 실패
  • 실패한 경우 모두 처리하지 않음
  • 기본적인 문법은 이렇다
    
    モデル.transaction do
      # テーブルへのアクセス処理
      # テーブルへのアクセス処理
    end
      # トランザクション処理が成功した場合の処理
    rescue => e
      # トランザクション処理が失敗した場合の処理
    
    주의점은 처리 실패 시 예외가 발생하는 방법을 사용하는 것이다.
    만약 포함된 처리 중 어느 하나도 실패하면, 사무는 사무 중의 어느 것도 처리하지 않지만, 사무를 처리하지 않는 조건은 '이상 발생' 이다.
    그럼 실제로 실시해 봅시다.

    이루어지다


    이번에 개발한 응용 프로그램에는 사용자의 그룹 기능이 있다.
    따라서 새 그룹을 만들 때 그룹을 만든 사용자가 자동으로 그룹에 속하는 사용자가 된다고 가정합니다.
    따라서 제작진 시절 예상치 못한 움직임이 생기지 않도록 이용 거래를 논의한다.
    표 구조는 이렇다.

    그룹 테이블 실례를 만드는 동시에user 로그인 사용자 idid 열 그룹users표 (users표와 그룹s표의 중간표) 를 만들고 싶습니다.
  • 그룹 테이블 만들기 실례
  • group_users 테이블 인스턴스 만들기
  • 만약 이 한두 개의 처리가 어떤 원인으로 인해 실패한다면 그룹스 컨트롤러의create 동작에서transaction을 활용하여 두 개의 처리가 발생하지 않게 합니다.
    groups_controller.rb
    # createアクション部分を抜粋
    # 変数current_userにはログインユーザーのインスタンスが格納
    
      def create
        @group = Group.new(group_params)
    
        # トランザクションを適用(グループの作成と中間テーブルを同時作成)
        # save! と create! と「!」がついている点に注意!
        @group.transaction do
          @group.save!
          current_user.group_users.create!(group_id: @group.id, permission: true)
        end
        # トランザクション成功時の処理
          flash[:success] = '新しいグループを作成しました'
          redirect_to @group
        rescue => e
        # トランザクション失敗時の処理
          flash.now[:danger] = 'グループ作成に失敗しました'
          render :new
      end
    
    
    이transation 내의 처리는 모두 "!"이다표 데이터 제작에 실패했을 때 예외적으로 발생하는 방법을 사용했습니다!
    만약transaction을 이용하지 않고 다음과 같은 방식으로 실현된다면, 어떤 원인으로 인해 groupusers표 제작에 실패하면 아무도 없는 그룹을 만들 수 있습니다.
    groups_controller.rb
    
    # transactionを利用しない場合
    
    def create
      @group = Group.new(group_params)
    
      if @group.save
        current_user.group_users.create(group_id: @group.id, permission: true)
        flash[:success] = '新しいグループを作成しました'
        redirect_to @group
      else
        flash.now[:danger] = 'グループ作成に失敗しました'
        render :new: 
      end
    end
    

    최후


    기사 읽어주셔서 감사합니다!
    이번에는 조사를 하면서 방법을 강구해 보았지만, 솔직히 거래에 대한 이해는 그리 깊지 않았다.만약 잘못이나 더 좋은 기술 방법 등이 있다면 마음대로 평론해 주십시오.
    아래의 보도를 참고하게 해 주세요.감사합니다.
  • https://web-camp.io/magazine/archives/18310
  • https://www.sejuku.net/blog/27240
  • 좋은 웹페이지 즐겨찾기