2012-02-14 4 views
1

그래서 많은 mysql 작업을 수행하는 큰 C++ 코드 기반을 물려 받았습니다. 코드는 항상 자동 커밋을 비활성화하고 다음과 같이 기능을 갖는 경향이있다 :자동 커밋이 발생하고 롤백이 발생하지 않습니다.

int function() { 
    if(mysql_real_query(conn, ...)) { 
     return -1; 
    } 

    if(mysql_real_query(conn, ...)) { 
     return -1; 
    } 

    mysql_commit(conn); 
    return 0; 
} 

물론, 여기에 의사가이 쿼리가 성공하는 경우에만 발생 커밋이다. 그러나 그들 중 하나가 아닌 경우 어떻게됩니까? 결국, mysql 연결은 제대로 닫히지 만 코드에는 롤백이 없습니다.

그래서 닫히면 기본적으로 성공한 변경 사항을 적용하겠습니까? 아니면 아무 일도 없었던 것처럼 롤백 할 것인가?

내 첫 번째 쿼리가 성공적으로 실행 취소되기 위해 두 번째 쿼리가 실패하면 롤백하는 것이 좋습니다. 따라서이 함수는 트랜잭션으로 끝납니다.

물론 이전의 일부 작업이 실패하면 나중의 다른 mysql 코드가 "이상한"상태로 물건을 남길 수 있기 때문에이 코드가 본질적으로 고장났습니다. 그러나 프로그램의 동작을 바꾸기 전에, 나는 현재의 행동이 무엇인지를 이해하고 싶었습니다.

+0

쉽게 테스트 할 수 있습니다. 트랜잭션을 시작하고 몇 가지 작업을 수행 한 다음 연결이 끊긴 상태에서 프로그램을 종료합니다. 변경 사항이 커밋되었는지 확인 / –

답변

1

Marc B가 말했듯이 실제로 테스트하기가 쉽습니다. 나는 누군가가 신뢰할 수있는 소스에서 지적 할 수 있지만, 테스트가 충분히 합리적인 것으로 보인다 기대했다 : 충분히

MYSQL *conn = mysql_init(NULL); 
mysql_real_connect(conn, host, use, password, database, 0, NULL, 0); 
mysql_autocommit(conn, 0); 
mysql_query(conn, "INSERT INTO test VALUES(1)"); 
mysql_query(conn, "INSERT INTO test VALUES(2)"); 
mysql_query(conn, "INSERT INTO test VALUES(3)"); 
mysql_query(conn, "INSERT INTO test VALUES(4)"); 
mysql_close(conn); 

간단한 끄고 자동 :

을 어쨌든, 나는 다음과 같은 코드를 시도 커밋, 많은 삽입 작업을 수행하고 커밋하지 마십시오. 이 경우 결과는 이 효과적으로으로 롤백됩니다. DB를 쿼리 할 때 행이 없습니다.

분명히 mysql_close(conn); 바로 앞에 mysql_commit(conn);을 추가하면 실제로 행이 만들어집니다.

관련 문제