프로그램

linux C 에서 transaction

(주)CKBcorp., 2014. 8. 29. 18:39
반응형




Transaction (트랜잭션)

우선사항 : mysql 이 transaction 을 지원하는 엔진을 가지고 있어야하며 작업하는 테이블의 타입이 transaction을 지원하는 타입이어야한다. transaction을 지원하는 엔진으로는 innoDB가 있다. 설정법은 아래를 참고하라.
http://wiz.pe.kr/444 
http://aladdin07.blog.me/150137323714 

방법 1.만약 다수의 sql문이 하나의 트랜잭션이라면 (transaction 은 검색해보도록) sql 문 실행전에 START TRANSACTION 을 호출하고 트랜잭션이 완벽히 수행되면 COMMIT , 트랜잭션의 요소중 하나라도 실행되지 않았다면 ROLLBACK을 호출하면 좋다.

방법 2. autocommit 옵션을 끄고 mysql_query() 후에 수행이 완벽하면 mysql_commit() 호출하여 저장 하면되고 수행이 완벽하지 않으면 mysql_rollback() 호출하여 복구하면 된다. 

방법 3. mysql_query("BEGIN") 후에 실행시킬 sql문을 수행후 수행이 완벽하면 mysql_query("COMMIT") 수행이 완벽하지 못하면 mysql_query("ROLLBACK") 하면된다.

참고 : http://www.yolinux.com/TUTORIALS/MySQL-InnoDb-Transactions-ForeignKeys.html
http://dev.mysql.com/doc/refman/5.0/es/connector-net-examples-mysqltransaction.html
http://dev.mysql.com/doc/refman/5.1/en/commit.html

테스트 결과 mysql_query("START TRANSACTION") 으로는 영향을 주지 않습니다.
mysql_autocommit(&mysql, false); // start transaction 
mysql_commit() or mysql_rollback()
mysql_autocommit(&mysql, true); // end transaction

저는 C++ 와 mysql을 연동할 때 C library를 사용하고, 아래와 같은 형식으로 사용합니다.
?
1
2
3
4
5
6
7
try {
  mysql_query(&conn, "BEGIN");
 
  mysql_commit(&conn);
} catch {
  mysql_rollback(&conn);
}

그런데 희안하게 rollback이 되지 않는 현상을 발견하여 이리저리 찾아본 결과
 
mysql_query(&conn, "BEGIN")이 되지 않는다는 것을 알았습니다.
 
제가 테스트한 환경은 windows8 pro, visual studio 2012 (november CTP), mariaDB 10.0.4 입니다.
어떤 환경인지는 모르겠으나 포럼에도 안된다는 글을 봤습니다.
 
그래서 저는 mysql에 접속할 때 SET autocommit=OFF 를 해주고 사용하고 있습니다.

mysql_query("START TRANSACTION")

-> mysql_query("BEGIN TRANSACTION")

mysql_query("BEGIN")

http://krids.tistory.com/184

http://onecellboy.tistory.com/216

https://www.google.co.kr/search?q=autocommit&oq=autocommit+&aqs=chrome..69i57j0l5.6941j0j4&sourceid=chrome&es_sm=93&ie=UTF-8#lr=lang_ko&newwindow=1&q=mysql_query(%22START+TRANSACTION%22)

http://database.sarang.net/?inc=read&aid=29772&criteria=mysql&subcrit=&id=&limit=20&keyword=lqez&page=10


입력시작시간:

모바일 스크립트 :

 


반응형