트랜잭션을 이용하는 목적은 쿼리의 작업을 수행하는 동안 발생된 쿼리 작업들을 되돌릴 수 있기 때문입니다. 작성한 쿼리 명령들이 즉시 데이터베이스에 적용된다고 생각해 봅 시다. 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
작업내용 켄슬(롤백)!