생각을 개발하자, 박진형

[rails] 레일즈 모델 - 트랜잭션 본문

Likelion/rails

[rails] 레일즈 모델 - 트랜잭션

imjinbro imjinbro 2017.03.04 01:58

[트랜잭션이란]

- db 처리를 할 때 묶음별로 처리를 할 때 묶음 내 모든 과정이 성공하면 비로소 db 처리를 하도록 할 때 사용함

- 트랜잭션으로 묶인 일련의 처리과정 속에 개별적인 sql 명령이 성공했을 때 처리 대기를 시켜둠

- 트랜잭션으로 묶인 개별 처리과정 모두가 성공했을 때 비로소 db 처리가 실행됨. 이것을 커밋(commit)이라 함

- 트랜잭션으로 묶인 일련의 처리과정에서 하나라도 실패하면 롤백(rollback)됨. 즉, 모든 저장된 db 처리가 취소됨

- 트랜잭션처리 흐름 

1) sql 명령

2) sql 명령 처리

3) 처리 성공 시 처리 대기 / 실패 시 rollback

3) 모두 성공 시 commit / 하나라도 실패 시 rollback

4) 트랜잭션 rollback 시 예외처리(rescue)

- 사용 예시 : 내 통장의 돈을 친구 통장으로 입금해줄 때


                



- 코드로 보기 : 서점의 책 관리 서비스에서 새로운 책이 들어와 책을 저장할 때 사용(간단한 사용예시를 위해 그냥...)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
def regist
    Book.transaction do
        b1 = Book.new(isbn: "978-4-7741-4223-0"
            title: "퍼펙트 루비 온 레일즈"
            price: 20000,
            publisher: "제이펍")            
        b1.save!
 
        #강제예외발생
        raise "예외발생, 모든 처리 취소"
 
        #b1에서 예외가 발생했기때문에 처리x
        b2 = Book.new(isbn: ~~~~
            ~~~~
            이하 생략
            ) 
        b2.save!
    end
    #end transaction
    render text: "트랜잭션 성공" #render말고도 원하는 액션 사용가능
    
    #예외처리
    rescue => e
        render text: e.message #error 메세지 출력말고 다른 액션 가능
end
cs


- 팁 : 모델 객체 저장시(레코드) save말고 save!를 이용하면 실패할 경우 예외를 던짐 : 트랜잭션 예외 발생 -> 롤백

  그렇지않고 save를 사용할 경우 리턴되는 것이 true/false이기때문에 관련 처리가 더 길어짐......


[트랜잭션 참고]

- 공식 API 문서 : http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html

- 퍼펙트 루비온레일즈 5장