[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 단위 락킹
상대적으로 높은 성능
읽기 위주의 요청에 유리
테이블 단위 락킹