[mysql] mysql에서의 commit, rollback 처리와 php에서의 transaction 처리 > db

본문 바로가기

db

[mysql] mysql에서의 commit, rollback 처리와 php에서의 transaction 처리

페이지 정보

작성자 서방님 댓글 0건 조회 37회 작성일 12-04-30 13:33

본문

begin...commit 사용
begin...rollback 사용
set autocommit=1 commit 사용
rollback 사용
참고로 TRUNCATE TABLE 문는 트랜젝션 처리를 하지 않는다.
삭제된 레코드의 복구가 불가능하다. 즉, rollback이 의미없음

현재의 autocommit 상태를 확인하는 방법은
mysql> set autocommit=0;
mysql> select @@session.autocommit;
@@session.autocommit
0

rollback처리
mysql> INSERT INTO table (column1,column2) VALUES (1,'1');
mysql> BEGIN;
mysql> UPDATE table SET column2 ='4' WHERE column1=1;
mysql> SELECT * FROM table;
column1 column2
1 4
mysql> ROLLBACK;
mysql> SELECT * FROM table;
column1 column2
1 1

commit처리
mysql> BEGIN;
mysql> UPDATE table SET column2 ='10' WHERE column1=1;
mysql> SELECT * FROM table;
column1 column2
1 10
mysql> COMMIT;
mysql> SELECT * FROM table;
column1 column2
1 10



php에서의 트렌젝션 처리예

<?
 // trans.php
 function begin()
 {
  mysql_query("BEGIN");
 }
 function commit()
 {
  mysql_query("COMMIT");
 }
 function rollback()
 {
  mysql_query("ROLLBACK");
 }
 
 mysql_connect("localhost","username", "password") or die(mysql_error());
 mysql_select_db("test") or die(mysql_error());

 $query = "INSERT INTO trans table (column1,column2)
        . "values (1,'1')";

 begin(); // transaction begins
 $result = mysql_query($query);
 if(!$result)
 {
  rollback(); // transaction rolls back
  echo "you rolled back";
  exit;
 }
 else
 {
  commit(); // transaction is committed
  echo "your insertion was successful";
 }
?>

 

 

롤백 실행시,

Warning Code : 1196
Some non-transactional changed tables couldn't be rolled back

위와 같은 에러 발생

 

<해결책>
위 두 문서에 의해,
SHOW TABLE STATUS LIKE 'tbl_name'; 
로 조회한 결과 Type이  MyISAM으로 되어 있어서
ALTER TABLE tbl_name TYPE = INNODB;
하여 Type을 변경하였더니 정상적으로 rollback처리 되었음
 
 
 
 
 
 
Begin...commit/begin...rollback
set autocommit=1로 설정한 경우 begin...commit이나
begin...rollback 문을 사용할 수 있다.
set autocommit=0로 설정한 경우 commit;
rollback;만 사용해도 된다.
TRUNCATE TABLE 문는 트랜젝션에 대해 안전하지 않다. 즉 BDB/InnoDB 테이블에서 트랜젝션을 사용하는 도중 TRUNCATE로 레코드를 삭제했을 때 삭제된 레코드의 복구가 불가능하다. 즉, rollback이 의미없음 TRUNCATE TABLE 테이블이름COMMIT; DELETE FROM 테이블이름과 같다. 【예제】 mysql> create table test2 (a int) type=innodb; Query OK, 0 rows affected (0.01 sec) mysql> set autocommit=1; ☜ autocommit의 디폴트값이 '1'이므로 실행하지 않아도 됨 Query OK, 0 rows affected (0.00 sec) mysql> insert into test2 values(10); Query OK, 1 row affected (0.00 sec) mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> update test2 set a=20 where a=10; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from test2; +------+ | a | +------+ | 20 | +------+ 1 row in set (0.00 sec) mysql> rollback; Query OK, 0 rows affected (0.00 sec) mysql> select * from test2; +------+ | a | +------+ | 10 | +------+ 1 row in set (0.00 sec) mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> update test2 set a=20 where a=10; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> commit; Query OK, 0 rows affected (0.00 sec) mysql> select * from test2; +------+ | a | +------+ | 20 | +------+ 1 row in set (0.00 sec) mysql>
현재의 autocommit 상태를 확인하는 방법은 다음 예제와 같다. 【예제】 mysql> select @@session.autocommit; +----------------------+ | @@session.autocommit | +----------------------+ | 1 | +----------------------+ 1 row in set (0.03 sec) mysql> set autocommit=0; Query OK, 0 rows affected (0.00 sec) mysql> select @@session.autocommit; +----------------------+ | @@session.autocommit | +----------------------+ | 0 | +----------------------+ 1 row in set (0.01 sec) mysql>

 

댓글목록

등록된 댓글이 없습니다.

Total 447건 1 페이지
게시물 검색

회원로그인

접속자집계

오늘
356
어제
457
최대
592
전체
39,965

그누보드5
Copyright © seobangnim.com All rights reserved.
자바스크립트를 활성화 하세요![ 브라우저에서 자바스크립트를 활성화하는 방법 ]