[MYSQL] Transaction 처리 ( commit, rollback ) 처리가 되지 않는 문제 해결 :: 소림사의 홍반장!


일단 연결된 Connection 을 가지고


Connection conn = null;

conn = ConfigConstants.DATASOURCE.getConnection();

conn.setAutoCommit(false);

 

try{

       // dml 처리 하나

       // dml 처리

       conn.commit();

} catch (Exception e) {

       conn.rollback();

}


요런식으로 Transaction을 제어할 테고..


뭐 당연한듯이 Exception이 발생하면 catch문의 rollback이 수행 될테지만 정상적으로 롤백이 수행되어도 예외 이전까지의 데이터는 커밋 처리가 되어버리는 경우가 있다.


결론부터 얘기하면 MySQL의 엔진 중 트랜잭션을 처리할 수 있는 DB 엔진은 innoDB라는 것!


트랜잭션 처리를 하고자 하는 테이블의 엔진을 innoDB 로 세팅해주어야 트랜잭션 제어가 가능하다!




* 엔진 변경 및 확인


1. 흔히 바꾸는 명령어는 다음과 같다.

alter table 테이블_이름 engine=InnoDB;

 하지만 위와 같은 명령어를 통해 테이블의 정보를 변경 할 경우, 실제로 운영하는 서비스의 처리속도가 떨어질 수 있다. 

 단순한 변환 명령보다 테이블을 새로 만드는 과정을 거치는 것이 좋다.


2.  다음과 같이 제일 마지막 부분의 ENGINE=InnoDB; 와 같은 구문을 첨가함으로써 InnoDB 테이블을 생성 가능하다.

CREATE TABLE customers (a INT, b CHAR (20), INDEX (a)) ENGINE=InnoDB;


3. 생성 후 다음과 같은 명령어로 InnoDB로 생성되었는지 확인 할 수 있다.

SHOW TABLE STATUS FROM test LIKE 'customers'





자 그럼 이제부터 MySQL의 여러가지 Engine에 대해 살펴보자.




대략 저런 엔진들이 있고 저런 특징들을 보이는데..


가장 많이 알려져 있고 또 가장 많이 사용하고 있는 엔진은 MyISAM과 InnoDB이다.


그전 까지는 MyISAM이 MySQL의 기본 엔진이었다면 MySQL 5.5부터는 InnoDB가 기본 엔진으로 바뀌었단다.


InnoDB의 특징

  • 트랜젝션 지원
  • 빈번한 쓰기, 수정, 삭제시 처리 능력
  • 디스크, 전원 등의 장애 발생시 복구 성능
  • 동시처리가 많은 환경에 적합
  • Row 단위 락킹 

MyISAM의 특
  • 상대적으로 높은 성능

  • 읽기 위주의 요청에 유리

  • 테이블 단위 락킹










다른 카테고리의 글 목록

삽질방지 팁 카테고리의 포스트를 톺아봅니다