hanseom 2021. 1. 31. 15:52
반응형

1. 트랜잭션의 기본 원칙(ACID 속성)

  1) 원자성(Atomicity) : 하나의 트랜잭션은 모두 하나의 단위로 처리

  2) 일관성(Consistency) : 트랜잭션이 성공했다면 DB의 모든 데이터는 일관성 유지

  3) 격리(Isolation) : 트랜잭션으로 처리되는 중간에 외부의 간섭은 없어야함

  4) 영속성(Durability) : 트랜잭션이 성공적으로 처리되면, 그 결과는 영속적으로 보관

 

2. 트랜잭션 매니저 설정

root-context.xml

  > 하나의 DataSource를 사용하는 경우, 스프링에서 제공하는 DataSourceTransactionManager를 이용, DataSource 주입

  > <tx:annotation-driven>은 @Transactional 애노테이션을 이용한 트랜잭션 관리가 가능

 

Note) @Transactional 우선순위

  1) 메소드의 @Transactional 설정이 가장 우선시 됩니다.

  2) 클래스의 @Transactional 설정은 메소드보다 우선순위가 낮습니다.

  3) 인터페이스의 @Transactional 설정이 가장 낮은 우선순위입니다.

 

3. 댓글 카운트 @Transaction 적용

  1) tbl_board 테이블 변경

    > alter table tbl_board add column replycnt int default 0;

  2) BoardVO.java

    > private int replycnt; 및 getter/setter 추가

  3) BoardSQL.xml

    > select절 replycnt 컬럼 추가

  4) BoardDAO.java, ReplyDAO.java

    > BoardDAO.java : public void updateReplyCnt(Integer bno, int amount) throws Exception; 추가

    > BoardSQL.xml : update tbl_board set replycnt = replycnt + #{amount} where bno = #{bno} 추가

BoardDAOImpl.java

  > ReplyDAO : public int getBno(Integer rno) throws Exception; 추가

  > ReplySQL.xml : select bno from tbl_reply where rno = #{rno} 추가

ReplyDAOImpl.java

  5) ReplyServiceImpl.java

ReplyServiceImpl.java

  6) list.jsp

list.jsp

  7) log 확인

@Transactional이 적용된 경우, Connection open > 2개의 SQL문 처리 후 commit() > Connection close

4. 게시물 조회 수 @Transaction 적용

  1) BoardDAO.java

    > public void updateViewCnt(Integer bno) throws Exception; 추가

  2) BoardSQL.xml

    > update tbl_board set viewcnt = viewcnt + 1 where bno = #{bno} 추가

  3) BoardDAOImpl.java

    > session.update(namespace + ".updateViewCnt", bno); 추가

  4) BoardServiceImpl.java

BoardServiceImpl.java (@Transactional 속성 : 격리 레벨 사용)

반응형
댓글수0