BLOG main image
분류 전체보기 (111)
주절주절 (16)
Tabex (4)
클라우드 관련 (12)
Linux (23)
CruiseControl (3)
XP (1)
C (4)
C++ (1)
C# (2)
Boost (3)
Java (0)
DataBase (4)
Algorithm (17)
Network (1)
OS (1)
UML (1)
상식 (3)
좋은 글 (3)
회사에서... (0)
Node.js (1)
EKS (1)
Mac (2)
Visitors up to today!
Today hit, Yesterday hit
daisy rss
tistory 티스토리 가입하기!
'트랜잭션'에 해당되는 글 2건
2009. 11. 21. 16:33
트랜잭션(Transaction)은 ATM, 데이터베이스 등의 시스템에서 사용되는 쪼갤 수 없다는 업무처리의 단위이다.

영어의 Transaction은 거래를 뜻한다. 예를 들어 돈을 주었는데 물건을 받지 못한다면, 그 거래는 이루어지지 못하고 원상태로 복구되어야 한다. 이와 같이 쪼갤 수 없는 하나의 처리 행위를 원자적 행위라 고 한다. 여기서 쪼갤 수 없다는 말의 의미는 실제로 쪼갤 수 없다기보다는 만일 쪼개질 경우 시스템에 심각한 오류를 초래할 수 있다는 것이다. 이러한 개념의 기능을 ATM 또는 데이터베이스 등의 시스템에서 제공하는 것이 바로 트랜잭션이다.

트랜잭션은 사용자가 시스템에 요구를 시작하여 시스템 내의 처리, 시스템에서 사용자에게 응답하는 모든 처리를 포함한다. 이러한 트랜잭션이 충족해야 하는 기술적인 요건은 ACID가 있다.

출처 : 위키백과

http://ko.wikipedia.org/wiki/%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98


1. 트랜잭션(transaction)
하나의 논리적 기능을 수행하기 위한 작업의 단위로서 데이타베이스의 일관된 상태를 또 다른 일관된 상태로 변환시킨다.

2. 트랜잭션 특성 (ACID)
(1). 원자성(Atomicity)
 트랜잭션은 자기의 션산을 전부 또는 전무(all or nothing) 실행만이 있지 일부 실행으로 트랜잭션의 기능을 갖는 것은 아니다.

(2). 일관성(Consistency)
 트랜잭션이 그 실행을 성공적으로 완료하면 언제나 일관성 있는 데이타베이스 상태로 변환한다. 즉, 트랜잭션 실행의 결과로 데이타베이스 상태가 모순되지 않는다.

(3). 격리성(Isolation)
 트랜잭션이 실행 중에 있는 연산의 중간 결과는 다른 트랜잭션이 접근할 수 없다.

(4). 영속성(Durability)
 트랜잭션이 일단 그 실행을 성공적으로 완료하면 그 결과는 영속적이다. 따라서 시스템은 어떤 경우에도 완료된 결과의 영속성을 보장해야 한다.

3. 트랜잭션 예 (계좌 이체)

T : Begin_Trans
       Read(A)
         A=A-100
       Write(A)
       Read(B)
         B=B+100
       Write(B)
     End_Trans

이 트랜잭션이 갖는 일관성 제약은, 이 트랜잭션이 실행되더라도 계좌 A와 계좌 B의 합계는 변하지 않아야 된다는 것이다.
A=A-100을 실행하고 B=B+100을 실행하는 도중 장애가 있어났다면 계좌 A와 계좌 B의 합계는 트랜잭션 T의 실행 전과 달라져 버리게 되어 일관성 제약을 위반하게 된다.
이러한 상태는 모순 상태(inconsistent state)라고 하는데 이러한 모순은 데이타베이스에서 허용되지 않는다.
원자성은 트랜잭션 실행의 시작에서부터 성공적으로 마칠 때까지를 한 단위로 해서 일관성을 검사하는 것이다.
원자성을 위한 연산에는 Commit(완료)와 Rollback(복귀) 연산이 있다.
Commit연산을 수행하면 그 트랜잭션의 실행이 성공적으로 종료되었음을 선언하는 것이다.
따라서 데이타베이스 상태는 일관성 있는 상태로 변환되었고 갱신된 데이타 아이템들의 값은 영속성을 갖도록 시스템이 보장하게 된다.
그러나 트랜잭션이 Rollback 연산을 수행하면 트랜잭션의 실행이 실패했음을 선언하는 것이다. 따라서 이 트랜잭션이 수행한 연산의 결과는 원상 복귀시켜야 된다.

4. 트랜잭션 상태
(1) 활동(active)
 트랜잭션이 Begin_Trans에서부터 실행을 시작하였거나 실행 중인 상태
(2) 부분완료(partially committed)
 트랜잭션이 마지막 명령문을 실행한 직후의 상태
(3) 실패(failed)
 정상적 실행을 더 이상 계속할 수 없어서 중단한 상태
(4) 완료(commited)
 트랜잭션이 실행을 성공적으로 완료하여 Commit 연산을 수행한 상태

BEGIN_TRANS;
       UPDATE
ACCOUNT
       SET Balace = Balance-100
       WHERE Accnt = 'A';
       IF ERROR GO TO UNDO;

       UPDATE
ACCOUNT
       SET Balace = Balance+100
       WHERE Accnt = 'B';
       IF ERROR GO TO UNDO;

       COMMIT
TRANS;
       GO TO
FINISH;

    UNDO:
       ROLLBACK
TRANS;
    FINISH:
       RETURN;

END_TRANS;

참고 & 출처 : 데이타베이스 시스템(DATABASE SYSTEM). 정익사. 이석호 저
2009. 11. 20. 15:53

하나씩 설치하다가 잘안되서...
깔끔하게 APM_Setup 으로 설치하였다 ~! (XP환경)

[InnoDB]

1. InnoDB가 사용가능한지 확인해본다.

mysql> show variables like 'have_innodb';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_innodb   | YES   |
+---------------+-------+
1 row in set (0.00 sec)

!!! 여기서 Value에 Disable라고 뜬다면, my.ini를 열어서...
# BDB타입을 사용할지 하지 않을지
#skip-bdb <- 이부분 앞에 #으로 바꿔주고 mysql 재시작 하면 된다 ~


2. 설정 상태 확인한다.
mysql> show status like '%innodb%';
+-----------------------------------+---------+
| Variable_name                     | Value   |
+-----------------------------------+---------+
| Com_show_innodb_status            | 0       |
| Innodb_buffer_pool_pages_data     | 19      |
| Innodb_buffer_pool_pages_dirty    | 0       |
| Innodb_buffer_pool_pages_flushed  | 0       |
| Innodb_buffer_pool_pages_free     | 493     |
| Innodb_buffer_pool_pages_misc     | 0       |
| Innodb_buffer_pool_pages_total    | 512     |
| Innodb_buffer_pool_read_ahead_rnd | 1       |
| Innodb_buffer_pool_read_ahead_seq | 0       |
| Innodb_buffer_pool_read_requests  | 77      |
| Innodb_buffer_pool_reads          | 12      |
| Innodb_buffer_pool_wait_free      | 0       |
| Innodb_buffer_pool_write_requests | 0       |
| Innodb_data_fsyncs                | 3       |
| Innodb_data_pending_fsyncs        | 0       |
| Innodb_data_pending_reads         | 0       |
| Innodb_data_pending_writes        | 0       |
| Innodb_data_read                  | 2494464 |
| Innodb_data_reads                 | 29      |
| Innodb_data_writes                | 3       |
| Innodb_data_written               | 1536    |
| Innodb_dblwr_pages_written        | 0       |
| Innodb_dblwr_writes               | 0       |
| Innodb_log_waits                  | 0       |
| Innodb_log_write_requests         | 0       |
| Innodb_log_writes                 | 1       |
| Innodb_os_log_fsyncs              | 3       |
| Innodb_os_log_pending_fsyncs      | 0       |
| Innodb_os_log_pending_writes      | 0       |
| Innodb_os_log_written             | 512     |
| Innodb_page_size                  | 16384   |
| Innodb_pages_created              | 0       |
| Innodb_pages_read                 | 19      |
| Innodb_pages_written              | 0       |
| Innodb_row_lock_current_waits     | 0       |
| Innodb_row_lock_time              | 0       |
| Innodb_row_lock_time_avg          | 0       |
| Innodb_row_lock_time_max          | 0       |
| Innodb_row_lock_waits             | 0       |
| Innodb_rows_deleted               | 0       |
| Innodb_rows_inserted              | 0       |
| Innodb_rows_read                  | 0       |
| Innodb_rows_updated               | 0       |
+-----------------------------------+---------+
43 rows in set (0.00 sec)

Value에 설정된 값은 아마 my-innodb-heavy-4G.ini 를 편집하면 바뀔것 같다.
지금은 그냥 해보는게 중요해서..ㅎㅎ 건너뜀 ~ㅎ



3. 기존의 테이블 엔진 바꾸기
먼저 테이블 속성을 보자 ~

mysql> use testdb;
mysql> show table status where name='inno_test';
+-----------+--------+---------+------------+------+----------------+-----------
--+-------------------+--------------+-----------+----------------+-------------
--------+---------------------+------------+-----------------+----------+-------
---------+---------+
| Name      | Engine | Version | Row_format | Rows | Avg_row_length | Data_lengt
h | Max_data_length   | Index_length | Data_free | Auto_increment | Create_time
        | Update_time         | Check_time | Collation       | Checksum | Create
_options | Comment |
+-----------+--------+---------+------------+------+----------------+-----------
--+-------------------+--------------+-----------+----------------+-------------
--------+---------------------+------------+-----------------+----------+-------
---------+---------+
| inno_test | MyISAM |      10 | Fixed      |    1 |             65 |          6
5 | 18295873486192639 |         2048 |         0 |           NULL | 2009-11-20 1
5:20:35 | 2009-11-20 15:24:25 | NULL       | utf8_general_ci |     NULL |
         |         |
+-----------+--------+---------+------------+------+----------------+-----------
--+-------------------+--------------+-----------+----------------+-------------
--------+---------------------+------------+-----------------+----------+-------
---------+---------+
1 row in set (0.00 sec)

MyISAM 엔진이다. 이제 InnoDB로 변경 !!!

mysql> alter table inno_test type=innodb;
Query OK, 1 row affected, 1 warning (0.11 sec)
레코드: 1개  중복: 0개  경고: 0개

mysql> show table status where name='inno_test';
+-----------+--------+---------+------------+------+----------------+-----------
--+-----------------+--------------+-----------+----------------+---------------
------+-------------+------------+-----------------+----------+----------------+
----------------------+
| Name      | Engine | Version | Row_format | Rows | Avg_row_length | Data_lengt
h | Max_data_length | Index_length | Data_free | Auto_increment | Create_time
      | Update_time | Check_time | Collation       | Checksum | Create_options |
 Comment              |
+-----------+--------+---------+------------+------+----------------+-----------
--+-----------------+--------------+-----------+----------------+---------------
------+-------------+------------+-----------------+----------+----------------+
----------------------+
| inno_test | InnoDB |      10 | Compact    |    1 |          16384 |       1638
4 |               0 |        16384 |         0 |           NULL | 2009-11-20 15:
20:35 | NULL        | NULL       | utf8_general_ci |     NULL |                |
 InnoDB free: 4096 kB |
+-----------+--------+---------+------------+------+----------------+-----------
--+-----------------+--------------+-----------+----------------+---------------
------+-------------+------------+-----------------+----------+----------------+
----------------------+
1 row in set (0.00 sec)

InnoDB로 변경이 되었다 ~

4. 트랜잭션. rollback, commit 해보기

mysql> select * from inno_test;
+------+------+
| a    | b    |
+------+------+
|    2 | cho  |
+------+------+
1 row in set (0.00 sec)

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> update inno_test set a=3;
Query OK, 1 row affected (0.00 sec)
일치하는 Rows : 1개 변경됨: 1개  경고: 0개

mysql> select * from inno_test;
+------+------+
| a    | b    |
+------+------+
|    3 | cho  |
+------+------+
1 row in set (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.03 sec)

mysql> select * from inno_test;
+------+------+
| a    | b    |
+------+------+
|    2 | cho  |
+------+------+
1 row in set (0.00 sec)

업데이트 쿼리를 하기전에 begin;을 입력하고 쿼리를 수행하면,
실제 데이터가 바로 바뀌지 않는다.
commit; 이 들어오면 실제로 바뀌게 되고 rollback;이 들어오면 적용하지 않게 된다.
이제는 commit;을 해보자.

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> update inno_test set a=3;
Query OK, 1 row affected (0.00 sec)
일치하는 Rows : 1개 변경됨: 1개  경고: 0개

mysql> select * from inno_test;
+------+------+
| a    | b    |
+------+------+
|    3 | cho  |
+------+------+
1 row in set (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.03 sec)

mysql> select * from inno_test;
+------+------+
| a    | b    |
+------+------+
|    3 | cho  |
+------+------+
1 row in set (0.00 sec)

적용이 되었다 ~
트랜잭션에 대해서 좀 더 공부해야겠다 ~~~!

prev"" #1 next