[트랜잭션이란]
- 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장
'기타 > 멋쟁이사자처럼' 카테고리의 다른 글
[git] 버젼관리 #2 (0) | 2017.03.22 |
---|---|
[git] 버젼관리 #1 (0) | 2017.03.20 |
[rails] 레일즈 모델 - 쿼리 인터페이스 스코프 (0) | 2017.03.03 |
[ruby] 루비 기초편 - Array (0) | 2017.03.02 |
[rails] 레일즈 모델 - 쿼리메서드 (0) | 2017.02.21 |
댓글