트랜잭션
정보처리기사를 공부하는 중에 자주 나오는 트랜잭션… 그 놈의 트랜잭션이 뭐길래 정의를 읽어봐도 뭔 멍멍이 소리인지도 모르겠고 그래서!!! 트랜잭션을 이해하기 위해 혹은 암기를 위해?! 내가 아는대로 ㅋㅋㅋㅋ로 써보는 트랜잭션에 관한 글.. 틀리면 틀렸다고 이야기해주세요…
정의는 아래와 같다… 읽어봐도 하나도 모르겠다 ㅠ
데이터베이스 트랜잭션(Database Transaction)은 데이터베이스 관리 시스템 또는 유사한 시스템에서 상호작용의 단위이다. 여기서 유사한 시스템이란 트랜잭션이 성공과 실패가 분명하고 상호 독립적이며, 일관되고 믿을 수 있는 시스템을 의미한다. 이론적으로 데이터베이스 시스템은 각각의 트랜잭션에 대해 원자성(Atomicity), 일관성(Consistency), 독립성(Isolation), 영구성(Durability)을 보장한다. 이 성질을 첫 글자를 따 ACID라 부른다. 그러나, 실제로는 성능향상을 위해 이런 특성들이 종종 완화되곤 한다. 어떤 시스템들에서는 트랜잭션들은 논리적 작업 단위(LUW, Logical Units of Work)로 불린다. |
출처: 위키백과
데이터베이스는 트랜잭션이라는 기능을 제공한다. “Insert, update 명령으로 데이터를 추가, 갱신할 때도 트랜잭션 기능을 사용한다.”라고 되어있다.
그런데 나는 insert나 update를 할 때 트랜잭션이라는걸 사용 해본적이 없는 것 같은데?? 트랜잭션이라는 것은 대체 무엇일까?
예를 들어 test2라는 테이블을 만들고 ‘seulgi’라는 데이터를 넣어주었다.
테이블이 잘 만들어졌는지 데이터가 잘 추가되었는지 확인한다.
- Commit: 트랜잭션 내에서 실행한 명령을 적용한 후 종료
- Rollback: 트랜잭션 내에서 실행한 명령을 파기한 후 종료
별도의 commit을 안 해도 저장이 잘 되는 것을 확인할 수 있다. 그렇다면 rollback으로 돌릴 수 있을까?
Rollback을 해도 전에 실행된 명령어가 취소되지 않는 것을 확인할 수 있다.
왜 이런 현상이 일어날까?
자동커밋이 되어있기 때문이다. Mysql 클라이언트에서 명령을 실행할 때는 자동커밋이 켜져 있는 상태이다. Insert나 update, delete가 처리될 때 마다 트랜잭션은 암묵적으로 자동커밋 상태로 되어있다.
갑자기… 혜성처럼 생각이 떠올랐다. 전에 회사 서버에 테스트를 위해 500만개의 테이블을 만드는 sql문을 돌린적이 있었는데 네트워크 접속이 끊긴 후 다시 돌아갔더니 500만개 테이블이 다 사라져 있었다.
그때는 단순하게 commit을 안 해서 그런가? 하고 500만개 테이블을 다시 생성하자 마자 commit을 해줘서 500만개 테이블을 저장했는데 이제와서 생각해 보니 회사 서버에 트랜잭션이 시작되어 있어서 그런게 아닐까? 라는 생각이 들었다(뇌피셜)
그렇다면 한번 트랜잭션을 사용해볼까?
트랜잭션의 시작을 선언해야 한다
그렇다면 트랜잭션이라는 것을 한번 사용해보자.
트랜잭션 시작: start transaction
동일하게 table을 만들고
Rollback을 해줬다.
내가 예상한 것은 테이블 생성된 것이 취소되어야 하는데...
앗 그런데 너무 저장이 잘되어있네..?
이유는 위에서 잠깐 언급한 자동커밋때문이다. 자동커밋을 종료해보자
자동커밋 종료: set autocommit=0;
자동커밋을 시작하고 싶으면 0 대신 1을 쓰면된다.
Set autocommit=0;
Start transaction;
을 사용해서 이번에는 만든 table을 삭제하고 rollback으로 복구하려고 했는데 rollback으로 복구가 되지 않는다…???
트랜잭션을 사용할 경우엔느 접속형태나 클라이언트 툴의 자동커밋 사용 여부 등, 트랜잭션 관련 기능을 파악해 둘 필요가 있다고 한다… 나는왜 안되는것일까
아 그리고 mysql의 트랜잭션 시작 명령어는 start transaction이지만 sql server나 postgresql은 begin transaction oracle이나 db2에서 트랜잭션을 시작하는 명령어는 따로 없다고 한다.
< 트랜잭션 시작 명령어 정리>
- mysql : start transaction
- sql server, postgresql : begin transaction
- oracle, db2 : 트랜잭션 시작하는 명령어 따로 없음
이정도 고민하고 생각했으면 정보처리기사에서는 트랜잭션 틀리진 않겠지!!
왜 rollback으로 복구가 되지 않는지 아는분 계시면 알려주세요! 트랜잭션의 개념을 잘못알고있는걸까?
DB의 세계는 너무 어렵다...
참고: sql 첫걸음
- 끝 -
결론)
한참 전에 쓴 글이나 지금이서야 결론을 작성하네요!!! 정답을 찾은지 오래되었는데 말이죠 ㅎㅎ
이 글을 쓴 것을 잃어버렸다가 친구랑 이야기를 나누다가 이런글을 썼다는 것이 기억이 났습니다 ㅎㅎㅎ 그래서 결론을 다시 작성하겠습니다.
트랜잭션을 확인하고 싶으면 다른 것으로 접속 해봐야 합니다. 아래에서 예를 들어보겠습니다.
sql developer에서 테이블을 create하고 데이터를 insert하고 sql plus에서 select문으로 확인하면 sql developer에서 만든 테이블과 추가한 데이터를 확인할 수 없습니다. 이때 commit을 해야만 sql plus에서 확인할 수 있습니다 이런것이 트랜잭션입니다~_~
'DATABASE > DB study' 카테고리의 다른 글
DB Constraints (NOT NULL, UNIQUE, primary key, foreign key) (0) | 2019.11.21 |
---|---|
DB function procedure package (0) | 2019.11.07 |
postsql basic sql (0) | 2019.08.20 |
what different between oracle 11g and oracle 12c (2) | 2019.08.02 |
DB 종류/DB 서버 모델/웹 애플리케이션 구조/SqlLite (0) | 2019.05.09 |
댓글