반응형
트랜잭션의 역할은 DB의 모든 작업을 일관되게 처리해주는 것이다. 그럼 JSP에서 트랜잭션을 이용하여 어떻게 DB의 작업을 일관되게 처리하고, 작업 도중 발생하는 문제를 어떻게 처리하여 원점으로 되돌릴까?
트랜잭션의 명령에는 크게 COMMIT과 ROLLBACK이 존재한다. COMMIT은 처리한 작업을 모두 완료하도록 하는 명령이며 ROLLBACK은 처리한 작업을 모두 되돌리는 명령이다.
예를 들어 인터넷 쇼핑 결제를 생각해보자. 상품을 주문할 때, 주문이 제대로 이루어지기 위해서는 결제 테이블에 결제 정보가 입력되는 작업이 이루어져야 하고, 결제가 제대로 이루어지면 주문 목록 테이블에도 해당 주문 내용이 입력되어야 한다. 이 두 작업이 모두 성공해야 주문 처리가 정상적으로 되는 것이다. 하지만 만약 결제는 제대로 되었는데 주문 목록에 내용이 들어가지 않으면 문제가 될 것이다. 이럴 때 일괄되게 처리해주기 위해 트랜잭션 처리를 하는 것이다.
다음은 단순하게 트랜잭션의 COMMIT과 ROLLBACK의 역할을 알아보기 위한 예제이다. 이 트랜잭션을 이용한다면 데이터의 일관성을 유지할 수 있다.
아래 코드는 sql1(레코드를 삽입) 명령어를 실행하고 sql2(id=1 인 레코드 SELECT) 명령어를 실행하려고 보니 존재하지 않아 commit 처리 안하고 rollback하는 예제이다. 이를 실습해보기 위해서는 test 테이블의 id 필드의 값이 1, 2인 레코드가 존재하지 않는 상태여야 한다.
- 20: 트랜잭션을 이용하기 위해서 setAutoCommit을 false로 설정한다.
자바의 autoCommit 속성은 기본 값이 true이므로 INSERT, DELETE, UPDATE 등의 데이터를 조작하는 작업을 실행했을 때 해당 작업이 즉시 완료되어 되돌리 수 없다. 즉, 트랜잭션 작업을 처리할 수 없다. 자바에서 트랜잭션 처리를 하려면 Connection 객체의 setAutoCommit(false)속성을 사용하여 autoCommit 속성을 false로 변경해 주어야 한다. - 23: 13 라인에서 정의한 INSERT문을 실행하는 부분이다. 20라인에서 트랜잭션을 시작시켰기 때문에 INSERT 작업은 메모리상에서만 이루어지고 데이터페이지에는 적용되지 않기 때문에 COMMIT을 수행해야 작업이 완료된다.
- 27~30: id=1인 레코드가 존재하지 않으면 23라인에서 실행한 INSERT 작업을 취소하는 부분이다.(conn.rollback();)
- 31~34: id=1인 레코드가 존재하면 23라인에서 실행한 INSERT 작업을 완료하는 부분이다.(conn.commit();)
반응형
'JSP & Servlet > 개념' 카테고리의 다른 글
MVC 패턴 (Model, View, Controller) (0) | 2022.06.16 |
---|---|
이클립스에서 DB 연동하기 (MySQL) (0) | 2022.06.16 |
ResultSet과 ResultSetMetaData (feat. 커서 이동 옵션) (0) | 2022.04.24 |
Statement와 PreparedStatement의 차이점 (0) | 2022.04.24 |
[JSP] JDBC 연동 (MySQL) - (2) (0) | 2022.04.24 |