과제 - 동영상 시청 후 TCL(transaction Control Language)에 대하여 조사한 후 MySQL 에서 Author 테이블을 만들고 트랜젝션 쿼리문 테스트 할 것
TCL이란 Transaction Control Language의 약어로써, DCL(Data Control Language)에서 트랜잭션을 제어하는 명령인 COMMIT
과 ROLLBACK
만을 따로 분리해서 TCL
이라고 표현하고 있다.
Syntax : COMMIT;
Syntax : ROLLBACK TO 'SAVEPOINT_NAME';
ROLLBACK TO SAVEPOINT
문을 사용하여 지정한 곳까지 ROLLBACK 할 수 있다.Syntax :
SAVEPOINT 포인터명;
SAVEPOINT 유의사항
mysql> select * from Author;
+----+---------+
| id | name |
+----+---------+
| 1 | Abhijit |
| 2 | Chris |
| 3 | Bravo |
| 4 | James |
+----+---------+
4 rows in set (0.00 sec)
mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)
mysql> SAVEPOINT D;
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO Author VALUES(5, 'Cap');
Query OK, 1 row affected (0.01 sec)
mysql> SELECT * FROM Author;
+----+---------+
| id | name |
+----+---------+
| 1 | Abhijit |
| 2 | Chris |
| 3 | Bravo |
| 4 | James |
| 5 | Cap |
+----+---------+
5 rows in set (0.00 sec)
mysql> ROLLBACK TO D;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT
->
-> * FROM Author;
+----+---------+
| id | name |
+----+---------+
| 1 | Abhijit |
| 2 | Chris |
| 3 | Bravo |
| 4 | James |
+----+---------+
4 rows in set (0.00 sec)
SELECT * FROM Author; 를 통해서 현재 Author
테이블이 내용을 볼 수 있다. 현재는 총 네개의 row가 저장되어 있다.
START TRANSACTION
으로 트랜잭션을 시작해주고, 그 상태에서 D
라는 savepoint를 생성해주었다.
그 상태에서 id=5, name=Cap이라는 값을 insert 해주었고 savepoint인 D
로 ROLLBACK
해주었더니 row
를 추가하기 전의 상태로 돌아갔다.
이런 경우에 TCL 을 주로 사용하는 것 같다. 지금처럼 간단히 연습용이 아니라 프로젝트를 시작하거나 실제 서비스에서 데이터를 직접 다룰 경우 실수를 방지하기 위해 이 개념을 숙지하고 있는것은 유용할거라 생각된다.
위의 설명에 start transaction이라는 문법을 중간에 넣어주다.
START TRANSACTION
이라는 명령어는 트랜잭션을 시작할 때 사용하는 명령어다. 해당 명령어 외에 BEGIN
이나 BEGIN WORK
를 입력해도 된다.
위의 명령어를 입력하고 Query OK
라는 메세지가 출력되면 정상적으로 트랜잭션이 시작된 것이고, 해당 문구가 출력되지 않으면 트랜잭션이 정상적으로 시작되지 않은것이니 확인이 필요하다.
처음 개념만 공부할때에는 START TRANSACTION 이라는 명령어에 대해서 알지 못했는데 막상 연습을 해보려고 하니 분명히 savepoint를 생성했고, Query OK 문구가 출력됐음에도 불구하고 해당 세이브포인트로 롤백을 하려고 하면 ERROR 1305 (42000): SAVEPOINT A does not exist
에러가 발생됐다.
에러가 발생한 내용에 대해서 내가 이해한 바를 적어보면, START TRANSACTION 명령을 해 주어야 SAVE POINT가 제대로 생성이 되고, 그 시점으로 ROLLBACK을 할 수가 있는 로직이라는 것이다. 원래는 COMMIT을 해주어야 데이터베이스에 저장을 하는 트랜잭션을 시작하는것인데 데이터베이스에서 자동으로 COMMIT 기능을 지원해주기에 COMMIT을 안해주어도 데이터가 저장이 되는것이고, 세이브 포인트를 저장하기 위해선 START TRANSACTION을 해주고 만들어주면 이제 '이 시점을 하나의 세이브 포인트로 만들거야'라는 인식을 시켜준다는 개념으로 생각했다.
따라서 다음과 같이 생각하자.
세이브 포인트를 만들 때는 START TRANSACTION을 실행하고 SAVE POINT를 생성하자. 그 후 롤백을 하면 에러가 발생하지 않고 해당 세이브 포인트로 롤백이 가능해진다.