기능테스트 중 작성한 값을 저장하는 로직에서 에러가 났는데 데이터는 들어가 있는 경우를 발견했다. 선임 개발자분이 알려주시기로는 DB 트랜잭션 실패 시 롤백이 되어야 하는데 해당 처리가 안되어있어서 발생하는 에러라고 하셨다. 임시로 롤백 처리하는 방법도 알려주셨는데, 처음 보는 코드라서 따로 검색해보았다.
먼저 트랜잭션 (Transaction)
이란, '데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 단위'라고 하는데, 쉽게 말하면 insert, update, delete 후 commit하기 전까지를 하나의 작업 단위로 묶어서 트랜잭션이라고 한다. 마치 무전기에 대고 말을 한 후 꼭 '오바'를 말해줘야 말이 끝났다는 것을 인식하기 쉬운 것과 같다. 무전기는 한 사람이 말하고 있으면 다른 사람은 말할 수 없고 기다려야 하는데, DB도 이와 비슷하다. 한 사람이 insert를 한 후 내 작업이 끝났다고 commit을 하지 않으면, 다른 작업자가 DB에서 작업을 할 수 없는 것이다.
commit하기 전까지가 하나의 트랜잭션이라고 생각하면, 하나의 트랜잭션 안에 여러 개의 작업을 할 수도 있을 것이다. A테이블에 insert, B테이블을 update하는 2개 작업을 한 후 commit을 하는데, 만약 첫번째 작업은 성공했으나 두번째 작업은 실패한 경우를 가정해보자. 경우에 따라 각 작업은 독립적이라 하나가 실패해도 나머지는 수행해도 되는 경우가 있고, 하나가 실패하면 다른 작업도 취소해야 되는 경우가 있다. 두번째 경우처럼 하나의 트랜잭션 안 여러 작업 중 하나라도 실패하면 모든 트랜잭션 작업을 취소해야 되는데, 이것을 롤백(Rollback)이라고 한다.