TCL
개요
Transaction Control Language.
트랜잭션 제어어
논리적인 작업 단위를 묶어 적용하고 취소한다.
commit, rollback, savepoint가 있다.
DML의 조작은 사실 commit을 때려야 적용이 된다.
(sql server에는 auto commit이 있어서 조금 다를 수 있다고)
이때 rollback을 때려버리면 커밋하기 전의 내용을 없던 일로 만들 수 있다.
commit을 때리면 실제 물리 디스크에 해당 내용이 반영된다.
COMMIT, ROLLBACK, SAVEPOINT
트랜잭션이 시작되면 락이 걸린다.
이때 각종 변경사항은 메모리에만 저장된다.
이 결과들은 트랜잭션을 진행하는 사용자는 확인할 수 있지만, 다른 사용자는 확인할 수 없다.
트랜잭션을 하다가 망했다 싶으면 롤백을 할 수 있다.
그러면 트랜잭션 내용은 다 날아간다.
다 됐다 싶으면 커밋.
이 경우에는 실제 디스크에 결과가 반영되며 이전 데이터는 영원히 사라진다.
이때 락은 해제되고 모든 사용자가 행을 조작할 수 있게 된다.
참고로 create, drop 등의 DDL은 자동 커밋이 된다.
그래서 이전에 잠깐 update 문장을 쓰고 이후에 ddl를 쓰게 되면..
원치 않는 커밋이 생길 수 있으니 주의하자.
또 sql 커넥션을 끊을 때도 자동 커밋이 된다.
본격 실습
내용이 작아서 따로 TOPIC으로 뻬지 않았다.
사실 dbeaver는 기본적으로 오토 커밋 모드를 지원한다.
그래서 롤백 오른쪽 버튼을 눌러서 수동 커밋 모드로 바꿔서 본격 실습을 진행할 수 있다.
현재는 이렇게 역삼이라는 이름을 가진 역이 있지만..
업데이트를 먼저 때리고 다시 조회하면 데이터가 변경된다.
이 상태에서 commit을 하면 실제로 db에 이렇게 반영되는 것이다!
롤백을 해서 되돌렸다.
간혹 이런 경우도 있다.
한 트랜잭션에 여러 번의 수정을 가하는 경우이다.
하지만 이걸 굳이 나누고 싶은 것이다.
논리 단위로서 트랜잭션은 원자성을 가지지만, 작업을 하는데 있어서 사람은 실수를 할 때도 있기 때문에 중간 중간 저장 지점을 또 둔다.
이때 사용하는 게 savepoint이다.
왜인지는 모르겠는데, 세이브포인트가 제대로 작동 안 하고 있다.
방배를 제외한 행은 역이란 글자가 붙어서 나와야 하는데..
https://github.com/dbeaver/dbeaver/issues/35821
비슷한 글이 있는데 버그는 맞다고 한다.
https://github.com/dbeaver/dbeaver/issues/29317
여기에서도 현시점의 dbeaver에 문제가 있음을 시인하고 있다.