[mysql] mysql에서의 commit, rollback 처리와 php에서의 transaction 처리
페이지 정보
작성자 서방님 댓글 0건 조회 351회 작성일 12-04-30 13:33본문
begin...commit 사용 | |
begin...rollback 사용 | |
set autocommit=1 | commit 사용 |
rollback 사용 |
삭제된 레코드의 복구가 불가능하다. 즉, 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> 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> 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이
ALTER TABLE tbl_name TYPE = INNODB;
MyISAM으로 되어 있어서
ALTER TABLE tbl_name TYPE = INNODB;
하여 Type을 변경하였더니 정상적으로 rollback처리 되었음
Begin...commit/begin...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>
set autocommit=1로 설정한 경우 | begin...commit이나 |
begin...rollback 문을 사용할 수 있다. | |
set autocommit=0로 설정한 경우 | commit; |
rollback;만 사용해도 된다. |
현재의 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>
댓글목록
등록된 댓글이 없습니다.