트랜잭션을 이용하는 목적은 쿼리의 작업을 수행하는 동안 발생된 쿼리 작업들을 되돌릴 수 있기 때문입니다. 작성한 쿼리 명령들이 즉시 데이터베이스에 적용된다고 생각해 봅 시다. 1개의 쿼리 명령이라면 쿼리를 수정하여 처리를 다시 하면 됩니다. 하지만 연관된 여러 쿼리를 복잡하게 처리해야 하는데 중간에 쿼리 작업 하나가 잘못되었다고 가정해 봅 시다. 이전의 작업들이 이미 적용되어서 다시 되돌리기 힘들 것입니다.
트랜잭션의 수동 커밋은 작업한 쿼리 명령들이 임시로 처리가 되기 때문에 트랜잭션을 처 리하기 이전의 상태로 되돌릴 수 있습니다.
| 쿼리 문법 |
ROLLBACK;
롤백 명령은 트랜잭션에서 처리한 작업을 되돌리기 합니다.
24.3.1 쿼리 실습
트랜잭션 모드로 변경 후에 쿼리 작업을 실습해 봅니다. 먼저 트랜잭션 모드로 작업하기 전의 상태를 미리 확인합니다.
| 콘솔 실습 화면 |
// 기존 테이블의 데이터를 확인합니다.
mysql> select * from members;
+----+----------+-----------+-------------+-------+---------+-----------+-------------------+
| Id | LastName | FirstName | Address | City | Country | manager | email |
+----+----------+-----------+-------------+-------+---------+-----------+-------------------+
| 1 | hojin | lee | shinchon | seoul | korea | infohojin | hojin@jinyphp.com |
| 2 | jiny | NULL | NULL | NULL | korea | infohojin | jiny@jinyphp.com |
| 3 | james | kim | youngdun-po | seoul | korea | info | james@jinyphp.com |
+----+----------+-----------+-------------+-------+---------+-----------+-------------------+
3 rows in set (0.01 sec)
트랜잭션 시작을 명령합니다. 트랜잭션 처리가 되면 수동 커밋 상태로 전환됩니다.
| 콘솔 실습 화면 |
// 트랜잭션 모드를 시작합니다.
mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)
트랜잭션 상태에서 일부러 실수를 만들어 봅니다. 원래는 데이터 하나만 삭제해야 되는데 조건을 설정하지 않아서 회원 테이블 전체의 데이터가 삭제되었습니다.
| 콘솔 실습 화면 |
// 테이블의 데이터를 삭제합니다.
mysql> delete from members;
Query OK, 3 rows affected (0.00 sec)
// 삭제된 결과를 확인합니다.
mysql> select * from members;
Empty set (0.00 sec)
아직 COMMIT 명령을 실행하지 않았기 때문에 실제적인 데이터 적용은 되지 않았습 니다. 다행으로 트랜잭션의 작업들은 되돌리기가 가능합니다.
| 콘솔 실습 화면 |
// 롤백합니다.
mysql> ROLLBACK;
Query OK, 0 rows affected (0.01 sec)
되돌리기 작업을 한 후에 다시 한번 회원 테이블을 확인해 봅니다.
| 콘솔 실습 화면 |
// 삭제된 데이터가 롤백됩니다.
mysql> select * from members;
+----+----------+-----------+-------------+-------+---------+-----------+-------------------+
| Id | LastName | FirstName | Address | City | Country | manager | email |
+----+----------+-----------+-------------+-------+---------+-----------+-------------------+
| 1 | hojin | lee | shinchon | seoul | korea | infohojin | hojin@jinyphp.com |
| 2 | jiny | NULL | NULL | NULL | korea | infohojin | jiny@jinyphp.com |
| 3 | james | kim | youngdun-po | seoul | korea | info | james@jinyphp.com |
+----+----------+-----------+-------------+-------+---------+-----------+-------------------+
3 rows in set (0.00 sec)
mysql>
데이터가 정상적으로 돌아왔습니다. 롤백 기능은 SQL 작업을 되돌릴 수 있지만 일부 명 령들은 적용되지 않습니다.
- DROP DATABASE
- DROP TABLE
- DROP 명령들
- ALTER TABLE
위의 명령은 롤백 기능이 지원하지 않습니다. 위의 명령들은 입력시 자동으로 커밋됩 니다.
24.3.2 PHP 실습
PHP 코드를 통하여 롤백 메서드를 만들어 봅니다.
| PHP 예제 | mysql.class.php 파일에 메서드 예제를 추가합니다.
public function rollback()
{
$queryString = "ROLLBACK";
// 쿼리를 전송합니다.
if (mysqli_query($this->dbcon, $queryString)=== TRUE) {
$this->msgEcho("쿼리성공] ".$queryString);
$this->msgEcho(" 작업내용 켄슬(롤백)!");
return true;
} else {
$this->msgEcho("Error] ".$queryString);
return false;
}
}
예제 파일 | trans-02.php
<?php
include "dbinfo.php";
include "mysql.class.php";
// ++ Mysqli DB 연결.
$db = new JinyMysql();
// 트렌젝션시작
if ($db->transaction()) {
// 데이터 전체를 삭제합니다.
$tbname = "members_all";
$db->deleteAll($tbname);
// 작업내용 롤백
// 위의 모든 데이터 작업을 취소합니다.
$db->rollback();
} else {
echo "트렌젝션 모드로 전환할 수 없습니다.";
}
?>
화면 출력
mysql connected!
쿼리성공] START TRANSACTION
트렌젝션 시작!
쿼리성공] DELETE FROM members_all
데이터 전체 삭제!
쿼리성공] ROLLBACK
작업내용 켄슬(롤백)!